首页 > 其他分享 >null和undefined的区别、数组和伪数组的区别

null和undefined的区别、数组和伪数组的区别

时间:2022-08-26 09:15:47浏览次数:73  
标签:console log 区别 length 数组 Array null

null和undefined的区别

undefined:

字面意思是未定义的值,语义是希望表示一个变量最原始的状态,而非人为操作的结果。这种原始状态会在以下四个场景中出现:

  • 声明了一个变量但没有赋值
  • 访问对象上不存在的属性
  • 函数定义了形参,但是没有传递实参
  • 使用void对表达式求值

null:

字面意思是空值,语义是希望表示一个对象被人为的重置为空对象,而非一个变量最原始的状态。在内存中的表示就是栈中的变量没有指向堆中的内存对象。

null有属于自己的数据类型NULL,而不是Object类型。

typeof为什么会将null判定为Object类型?

因为JS数据类型在底层都是以二进制的形式表示的,二进制的前三位为0就会被typeof判断为Object类型,而null的二进制恰好都是0,因此null被误判为Object类型。


数组和(类)伪数组的区别

数组:

数组是一个特殊对象,与常规对象的区别:

  • 有新的元素添加到列表中的时候,自动更新length属性
  • 设置length属性,可以截断数组
  • 从Array.prototype中继承了方法
  • 属性为Array

类数组:

类数组是一个拥有length属性,并且他属性为非负整数的普通对象,类数组不能直接调用数组方法。


区别:

类数组是简单对象,它的原型关系和数组不同

// 原型关系和原始值转换
let arrayLike = {
    length: 10,
};
console.log(arrayLike instanceof Array); // false
console.log(arrayLike.__proto__.constructor === Array); // false
console.log(arrayLike.toString()); // [object Object]
console.log(arrayLike.valueOf()); // {length: 10}

let array = [];
console.log(array instanceof Array); // true
console.log(array.__proto__.constructor === Array); // true
console.log(array.toString()); // ''
console.log(array.valueOf()); // []

类数组转换为数组

转换方法:

  • 使用Array.from()
  • 使用Array.prototype.slice.call()
  • 使用Array.prototype.forEach()进行属性遍历并且组成新的数组

转换须知:

  • 转换后的数组长度由length决定。索引不连续的时候,转换结果是连续的,会自动补位。
    • let al1 = {
          length: 4,
          0: 0,
          1: 1,
          3: 3,
          4: 4,
          5: 5,
      };
      console.log(Array.from(al1)) // [0, 1, undefined, 3]
      
  • 仅考虑0或者正整数的索引
    • // 代码示例
      let al2 = {
          length: 4,
          '-1': -1,
          '0': 0,
          a: 'a',
          1: 1
      };
      console.log(Array.from(al2)); // [0, 1, undefined, undefined]
      
  • 使用slice转换产生稀疏数组(就是数组实际个数 < length的数组,如下例)
    • let al2 = {
          length: 4,
          '-1': -1,
          '0': 0,
          a: 'a',
          1: 1
      };
      console.log(Array.from(al2)); //[0, 1, empty × 2]
      
  • 使用数组方法操作类数组需要注意的地方
    • let arrayLike2 = {
        2: 3,
        3: 4,
        length: 2,
        push: Array.prototype.push
      }
      
      // push 操作的是索引值为 length 的位置
      arrayLike2.push(1);
      console.log(arrayLike2); // {2: 1, 3: 4, length: 3, push: ƒ}
      arrayLike2.push(2);
      console.log(arrayLike2); // {2: 1, 3: 2, length: 4, push: ƒ}
      

标签:console,log,区别,length,数组,Array,null
From: https://www.cnblogs.com/luckest/p/16626428.html

相关文章

  • Resource和Autowired区别
     使用场景:@Resource和@Autowired都是做bean注入时使用@Resourece是JDK的注解,不是spring的注解;由包javax.annotation.Resourece提供,需要导入;但是Spring支持该......
  • arduino自定义库c与c++的区别
    起初是想把手头的红牛开发板的基于stm32标准库的例子都改成用arduino库的   发现arduino库是基于hal库的 不是直接把c文件挪过来就能用的arduino是c++编译器 如......
  • 删除有序数组中的重复项
    删除有序数组中的重复项一、题目描述给定一个有序数组,原地删除重复出现的元素,是每一个元素只出现一次,返回新的长度。不使用额外的空间。实例:输入:nums=[1,1,2,3]输出......
  • python实现给定K个字符数组,从这k个字符数组中任意取一个字符串,按顺序拼接,列出所有可能
    题目描述:给定K个字符数组,从这k个字符数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合结果!样例:input:[["a","b","cd",["de"],["e","f"]]output:["adee","adef"......
  • 通过翻转子数组使两个数组相等
    通过翻转子数组使两个数组相等一、题目描述给定两个相同的非空整数数组,将其中一个数组翻转任意次可以得到两个相同的数组,则返回true否则返回false。实例1输入:targer=......
  • 安卓buildscript和allprojects的作用和区别
    buildscript中的repositories和allprojects的repositories的作用和区别1、buildscript里是gradle脚本执行所需依赖,分别是对应的maven库和插件。在打包的时候,gradle会使用......
  • jack与jacky有什么区别
    jack与jacky有什么区别_百度知道 https://zhidao.baidu.com/question/407487746.html英语中如果别人把名字末尾加y是一种比较亲切的叫法,有时甚至会删减字母再加y,意思是......
  • 数组的常用操作
     数组过滤:Array.every((x,index,arr)=>x>2)every每一个都满足条件返回true,有一个不满足返回false 不改变原数组 Array.some((x,index,arr)=>x>2)some有一个......
  • go-redis和redigo连接池的区别
    go-redis是自动管理,类似go/sql包的方式,在真正执行的时候从连接池取一个连接,执行完毕后放回去,对调用者透明。调用者如果手动关闭连接,连接不能被复用,表现上看就是redis服务器......
  • js数组对象的遍历
    //数组循环的方法vararr=[{code:10},{value:100},{name:'大乔'},{age:'18'}];//for----offor(letitemofarr){console.log('for--of',......