JavaScript学习笔记 - 值的类型的一些知识点

JavaScript核心概念解析
本文深入探讨JavaScript中的关键概念,包括类型判断、数组特性、函数属性、类数组对象处理、数值精度问题、特殊值如NaN的理解及检测方法、基本类型与引用类型的差异等内容。
1. typeof null === 'object'

不同的对象在底层都表示为二进制,在Javascript中二进制前三位都为0的话会被判断为Object类型,null的二进制表示全为0,自然前三位也是0,所以执行typeof时会返回"object"。

2. 数组的字符串键值如果可以转换成十进制数组,那么就会变成数组的下标。

例子:

3. 函数是可以调用的对象

函数可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于函数可以被调用,函数的length属性时函数形参的数量。

例子:

4. 类数组对象

类数组对象具有length属性,也可以通过[下标]这种方法获取对应的值,但是它无法使用数组的push,forEach,indexOf等方法,并不是真正的数组。

例子:

可以通过以下两种方法将类数组对象变为数组:

  1. Array.prototype.slice.call(类数组对象)
  2. Array.from(类数组对象)

例子:

5. 0.1 + 0.2 !== 0.3

JavaScript中数字类型基于IEEE 754标准实现,该标准通常被称为“浮点数”,JavaScript使用的是双精度格式(64位二进制),二进制浮点数的问题就是:

0.1 + 0.2 !== 0.3;

在二进制浮点数中 0.1 + 0.2 = 0.30000000000000004

可以通过设置一个误差范围来判断0.1 + 0.2和0.3是否相等。这个误差范围成为“机器精度”,在JavaScript中,这个值一般是2.220446049250313e-16,从ES6开始,可以通过Number.EPSILON获得。

function numbersCloseEnoughEqual(num1, num2) {
    return Math.abs(num1 - num2) > Number.EPSILON;
}

let a = 0.1 + 0.2;
let b = 0.3;

numbersCloseEnoughEqual(a, b);   // true
复制代码
6. Number.MAX_VALUE,Number.MIN_VALUE,Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER

JavaScript中:

  • Number.MAX_VALUE,定义了能够呈现的最大浮点数
  • Number.MIN_VALUE,定义了能够呈现的最小浮点数
  • Number.MAX_SAFE_INTEGER,定义了能够呈现的最大整数
  • Number.MIN_SAFE_INTEGER,定义了能够呈现的最小整数

7. .运算符

.运算符需要注意的一点是:因为它是一个有效的数字字符,会被优先认为是数字的一部分,然后才是对象的属性访问运算符,这就导致了下面这些情况:

8. null 和 undefined
  • null,空值
  • undefined,未赋值

可以使用 void 运算符获得安全的undefined,比如:void 0;

关于安全的undefined,可以看看这篇文章var undefined = 1 这样赋值有效果吗?

9. NaN

NaN指的是“不是一个数字”(not a number),但是它却是数字类型,而且它是自己和自己不相等:

NaN === NaN;  // false

typeof NaN;  // "number"
复制代码

如何检测一个值是不是NaN:

  • isNaN和Number.isNaN

    全局方法isNaN并不可靠

    isNaN('foo'); // true
    复制代码

    foo并不是NaN,而结果却是true。

    所以推荐使用Number.isNaN方法:

    Number.isNaN('foo');  // false
    Number.isNaN(NaN);  // true
    复制代码

    Number.isNaN是ES6中添加的,ES6之前可以用下面这种方法检测:

    if(!Number.isNaN) {
        Number.isNaN = function(value) {
          var n = parseInt(value);
          return n !== n;
      };
    }
    复制代码
10. 基本类型和引用类型

JavaScript中除了对象以外,其他类型都叫基本类型。

它们之间的区别通过一个例子说明:

let obj = { 
    a: 1
};

let obj1 = obj;

obj1.b = 2;

console.log(obj);  {a: 1, b: 2}

console.log(obj1); {a: 1, b: 2}

let str = 1;
let str1 = str;

str1 += 1;

console.log(str);  // 1
console.log(str1); // 2

复制代码

因为引用类型传递的是值的地址,所以obj和obj1中的地址指向的是同一个对象,改变其中一个会影响到另一个。基本类型相当于将原始值赋值了一份给目标值,原始值和目标值是独立的,相互不会影响。

对于引用类型来说,一个引用无法改变另一个引用的指向。 例子:

let arr = [1,2,3];
let arr1 = arr;

arr1 = [4,5,6];

console.log(arr);   // [1,2,3]
console.log(arr1);  // [4,5,6]
复制代码

所以引用类型的值在拷贝的时候分为浅拷贝和深拷贝,浅拷贝就像例子中的一样,直接赋值即可,深拷贝可以使用JSON.parse(JSON.stringify(obj))实现。

转载于:https://juejin.im/post/5b9f4dec5188255c533615dd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值