JavaScript知识点总结(未完待续)

2020/3/1 11:15:01

本文主要是介绍JavaScript知识点总结(未完待续),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、变量

1. 数据类型

  • 基本数据类型

    • String

    • Number

    • Boolean

    • null

      特殊: typeof null === 'Object' //true

    • Undefined

    • Symbol 符号(ES6新增)

  • 引用数据类型

    • Object
      • Function
      • Array
      • Date
      • RegExp
  • 基本数据类型和引用数据类型的区别(存储位置不同)

    • 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
    • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体

数据封装类对象:ObjectArrayBooleanNumberString

其他对象:FunctionArgumentsMathDateRegExpError

2. 类型判断

2.1 null

typeof null === 'Object' //true

null是唯一一个用typeof检测会返回object基本类型值(注意‘基本’两字)

原因:不同的对象在底层都表示为二进制 在JavaScript中二进制前三位为0的话都会被判断为object类型 null的二进制表示全是0,自然前三位也是0 所以 typeof null === “object”

2.2 引用类型的判断

参考链接:深入理解JS的类型、值、类型转换

2.2.1 typeof

  • typeof 除了能判断基本类型、Object外,还能判断function类型

2.2.2 instanceof

  • 判断对象用 instanceof,其内部机制是通过原型链来判断的

  • instanceof原理:判断实例对象的__proto__属性,和构造函数的prototype属性,是否为同一个引用(是否指向同一个地址)

  • 注意1:虽然说,实例是由构造函数 new 出来的,但是实例的__proto__属性引用的是构造函数的prototype。也就是说,实例的__proto__属性与构造函数本身无关。

    注意2:在原型链上,原型的上面可能还会有原型,以此类推往上走,继续找__proto__属性。这条链上如果能找到, instanceof 的返回结果也是 true。

我们也可以试着实现一下 instanceof
function instanceof(left, right) {
    // 获得类型的原型
    let prototype = right.prototype
    // 获得对象的原型
    left = left.__proto__
    // 判断对象的类型是否等于类型的原型
    while (true) {
    	if (left === null)
    		return false
    	if (prototype === left)
    		return true
    	left = left.__proto__
    }
}
复制代码
  • 分析一个问题

问题:已知A继承了B,B继承了C。怎么判断 a 是由A直接生成的实例,还是B直接生成的实例呢?还是C直接生成的实例呢?

分析:这就要用到原型的constructor属性了。

  • foo.__proto__.constructor === Foo的结果为true,但是 foo.__proto__.constructor === Object的结果为false。

所以,用 consturctor判断就比用 instanceof判断,更为严谨。

  • 如果我们想获得一个变量的正确类型,可以通过 Object.prototype.toString.call(xx)

3. 类型转换

2.3.1 显示类型转换

  • 转换成字符串 String()

    toString() 可以被显式调用,或者在需要字符串化时自动调用

    null 转换为 "null",undefined 转换为 "undefined",true 转换为 "true"。 数字的字符串化则遵循通用规则 极小和极大的 数字使用指数形式:

    // 1.07 连续乘以七个 1000
    var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
    // 七个1000一共21位数字 
    a.toString(); // "1.07e21"
    复制代码

    数组的默认 toString() 方法经过了重新定义,将所有单元字符串化以后再用 "," 连接起来

    var a = [1,2,3];
     a.toString(); // "1,2,3"
    复制代码
  • 转换成数字 Number()

    其中 true 转换为 1,false 转换为 0。undefined 转换为 NaN,null 转换为 0。 处理失败 时返回 NaN(处理数字常量失败时会产生语法错误)

  • 转换成布尔值 Boolean()

    • u
                       

    这篇关于JavaScript知识点总结(未完待续)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程