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: ƒ}

null和undefined的区别、数组和伪数组的区别的更多相关文章

  1. JavaScript中的数组与伪数组的区别

    在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function). 基本数据类型:String,boolean,Number,Undefined, Null 引用数 ...

  2. JavaScript数组和伪数组

    伪数组和数组 记住一句话: 伪数组是一个Object,数组是Array. 对象和数组之间的关系 JavaScript的内置函数继承与 Object.prototype. 可以认为new Array() ...

  3. JS高级---数组和伪数组

    数组和伪数组  伪数组和数组的区别 真数组的长度是可变的 伪数组的长度不可变 function f1() { var sum = 0; for (var i = 0; i < arguments ...

  4. javaScript删除对象、数组中的null、undefined、空对象、空数组方法

    这两天在项目中遇到后台需要传的数据为不能有null,不能有空值,而这个数据又是一个庞大的对象,对组集合,所以写了个方法来解决这个问题.为了兼具所有的种类类型,封装了方法,代码如下: let obj = ...

  5. JavaScript--数组与伪数组(特殊对象)的区别

    一.数组与伪数组的区别例子: 从原型链上解析: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. Javascript null和undefined

    Javascript的数据类型包括数字.字符串.布尔值.null.undefined和对象.其中null和undefined是两种特殊的原始类型,很容易混淆.今天就来剖析一下null和undefine ...

  7. JS-数组与伪数组

    数组与伪数组 把符合以下条件的对象称为伪数组: 具有length属性 按索引方式存储数据 不具有数组的push,pop等方法 伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行 ...

  8. 字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||

    换行的字符串 "This string\nhas two lines" 字符串中使用单引号时应该怎么写 'You\'re right, it can\'t be a quote' ...

  9. tips null和undefined的区别

    tips null和undefined的区别 1.undefined类型 undefined类型只有一个值,即特殊的undefined.在使用var声明变量但未对其加以初始化时,这个变量的值就是und ...

随机推荐

  1. HTTP Status 405 - Request method 'GET' not supported?(尚硅谷Restful案例练习关于Delete方法出现的错误)

    哈罗大家好,最近在如火如荼的学习java开发----Spring系列框架,当学习到SpringMVC,动手实践RESTFUL案例时,发现了以上报错405,get请求方法没有被支持. 首先第一步,我查看 ...

  2. 微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹

    之前的文章中我们介绍了如何通过 Nocalhost 快速开发 Rainbond 上的微服务,介绍了基本的开发流程. 本文将续接上文继续介绍,使用 Nocalhost 开发配置文件 实现以下内容: 一键 ...

  3. Tapdata x 轻流,为用户打造实时接入轻流的数据高速通道

      在全行业加速布局数字化的当口,如何善用工具,也是为转型升级添薪助力的关键一步.   那么当轻量的异构数据实时同步工具,遇上轻量的数字化管理工具,将会收获什么样的新体验?此番 Tapdata 与轻流 ...

  4. Map接口总结(如何使用默认方法)

    Map接口总结(如何使用默认方法) Map的基本使用 默认方法的问题,有什么坑 常用的默认方法应用场景 基本操作 get put(区别:Collection接口中添加为set) putAll remo ...

  5. for增强

    package study5ran2yl.study; public class ForDemo02 { public static void main(String[] args) { int[] ...

  6. 软件测试—Day2

    day2 Q:面试过程中,性能测试你测试什么?关注的点是什么? A:程序的响应时间,系统的吞吐量,以及并发用户数,和tps,qps,以及DB的IOPS,和服务器的系统资源(CPU和内存).通过一定的工 ...

  7. Windows快捷安装应用方法(此处以Virtualbox为例)

    1.执行已下载的virtualbox的安装exe文件,使用pywinauto模拟点击Windows安装的对应控件 1.1.启动exe文件 start *.exe 1.2.使用pywinauto(也适用 ...

  8. 浅谈 exgcd

    众所周知欧几里得算法是: \[\gcd(a,b)=\gcd(b,a\bmod \,b) \] 也叫辗转相除法. 拓展欧几里得算法(exgcd),可以用来找到形如 \(ax+by=\gcd(a,b)\) ...

  9. BACnet IP转OPC UA网关

    BACnet是楼宇自动化和控制网络数据通信协议的缩写.它是为楼宇自动化网络开发的数据通信协议   根据1999年底互联网上楼宇自动化网络的信息,全球已有数百家国际知名制造商支持BACnet,包括楼宇自 ...

  10. composer常用命令(部分摘抄)

    1. 仅更新单个库 composer update foo/bar 2. 不编辑composer.json的情况下安装库 composer require "foo/bar:1.0.0&qu ...