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. 面向对象的封装(粘贴Markdown代码解决缩进问题)

    直接粘贴idea的代码会导致缩进错乱,建议先粘贴到记事本再粘贴到笔记!!! 1.先将属性私有化,再对外提供简单的接口可以访问内部.如set.get方法 2.set方法:修改年龄 public void ...

  2. maven编译 出现Process terminated

    问题: 解决方案: 在Settings中配置一下maven

  3. 使用Thread类和Runnable接口实现多线程的区别

    使用Thread类和Runnable接口实现多线程的区别 先看两种实现方式的步骤: public class ThreadDemo{ public static void main(String[] ...

  4. vue封装原生的可预览裁剪上传图片插件H5,PC端都可以使用

    思路:1.先做出一个上传的图片的上传区 <!-- 上传区 --> <label for="fileUp"> <div class="upBo ...

  5. spingboot打jar包

    pom.xml文件中packaging为jar <packaging>jar</packaging> 安装插件 <plugin> <groupId>or ...

  6. 阈值PSI代码

    阈值PSI 若交集数量超过某个给定阈值时,允许分布式的各个参与方在自己集合中找到交集,且除了交集外,得不到其他额外信息. 实现论文: Multi-Party Threshold Private Set ...

  7. 【一本通提高树链剖分】「ZJOI2008」树的统计

    [ZJOI2008]树的统计 题目描述 一棵树上有 n n n 个节点,编号分别为 1 1 1 到 n n n,每个节点都有一个权值 w w w. 我们将以下面的形式来要求你对这棵树完成一些操作: I ...

  8. 从零开始搭建Vue2.0项目(一)之快速开始

    从零开始搭建Vue2.0项目(一)之项目快速开始 前言 该样板适用于大型,严肃的项目,并假定您对Webpack和有所了解vue-loader.确保还阅读vue-loader的文档,了解常见的工作流程配 ...

  9. 题解【CodeForces 910A The Way to Home】

    题目大意 一只青蛙现在在一个数轴上,它现在要从点 \(1\) 跳到点 \(n\) ,它每次可以向右跳不超过 \(d\) 个单位.比如,它可以从点 \(x\) 跳到点 \(x+a\)(\(1\le a\ ...

  10. Flutter-填平菜鸟和高手之间的沟壑

    Flutter-填平菜鸟和高手之间的沟壑 准备写作中... 1.Flutter-skia-影像,Flutter skia-图形渲染层.应用渲染层2.方法通道使用示例,用于演示如何使用方法通道实现与原生 ...