JS变量类型和计算|| 原型和原型链

1.知识点

 

JS变量类型和计算|| 原型和原型链

 

2.变量类型和计算

2.1 题目

JS变量类型和计算|| 原型和原型链

 

2.2 值类型和引用类型的区别

js变量按照存储方式区分为值类型和引用类型

值类型  特点:把每个值放在它自己的内存空间中,值是复制的,值的改变相互之间没有影响。

 

特点:值是指向同一个内存地址,也就是说它们是指针相互传递的,这样的话修改一个值,另一个值也发生改变,它们相互受影响,目的在于能通过这种方式减少内存开销。

JS变量类型和计算|| 原型和原型链JS变量类型和计算|| 原型和原型链

左图值类型,给b开辟一个新地址,并将a的值赋值给b,修改其中一个对另一个不会有影响

右图引用类型,将a的指针赋给b,b的指向和a的指向是同一位置,所以修改a、b中的任意一个,两者都会被修改

 

2.3 typeof运算符的结果

6种,4种值类型,2种引用类型。number,boolean,string,undefined为值类型   object,function是引用类型。

(1)typeof只能区分值类型的undefined、string、number、boolean;引用类型只能区分object、function。

(2)数组、对象、null都是object,      

JS变量类型和计算|| 原型和原型链

 

2.4 变量计算——强制类型转换

2.4.1 字符串拼接

如果是一个数字+字符串,js会把数字转换为字符串,然后和后面的字符串拼接起来。

JS变量类型和计算|| 原型和原型链

2.4.2 ==运算符(慎用)

100和‘100’,会把100转换为‘100’,然后两边相等,会返回true;
0和‘ ’,会把这两个都转为false,然后两边相等,会返回true;
null和undefined,会把这两个转为false,然后两边相等

JS变量类型和计算|| 原型和原型链

2.4.3 if语句

会把传入的变量强制转换为布尔值,然后进行判断

JS变量类型和计算|| 原型和原型链

2.4.4 逻辑运算符

(1)&&:&&是逻辑与操作,在执行过程中,只要有一个false,就会停止,返回当前值。

       10 && 0结果是0,因为第一个操作数是10转成布尔值为真,继续向后执行, 0转成布尔值而false, 那么就会返回0。

(2)||:||是逻辑或操作, 在执行过程中,只有一个true,就会停止, 返回当前值。

      '' || 'abc' 的结果是abc, 因为第一个操作数‘’空字符串转成布尔值是false, 继续向后执行, 'abc'转成布尔值是true, 那么返回结果就是abc。

(3)!(非):abc是未定义的,转为布尔值为true,经过‘!’的转换后为true。

     【判断一个变量会被当做true还是false,可以通过‘!!’来判断,最后得到的结果就是它转为布尔值后得到的结果。】    

JS变量类型和计算|| 原型和原型链

 

2.5 何时使用 === 和 ==

 只有在判断一个变量是否等于null的时候用== ,

因为比较简洁,而且是JQuery源码推荐的写法。

JS变量类型和计算|| 原型和原型链

2.6 JS中的内置函数

9种,Number,Array,String,Boolean,Object,Function,     Date,Error,RegExp

JS变量类型和计算|| 原型和原型链

2.7 如何理解JSON

从JS语法看,JSON是一个JS的内置对象,有 2 个常用的API;同时JSON也是一种数据格式


JSON.stringify() 方法   用于将 JavaScript 值(对象)转换为 JSON 字符串。
JSON.parse() 方法   用于将一个 JSON 字符串转换为对象(JavaScript 值)    

JS变量类型和计算|| 原型和原型链

 

3.原型和原型链

JS变量类型和计算|| 原型和原型链

 

JS变量类型和计算|| 原型和原型链

3.1 构造函数

大写字母开头,通过构造函数可以new出很多实例,所以构造函数相当于模板

JS变量类型和计算|| 原型和原型链

3.2 构造函数——扩展

JS变量类型和计算|| 原型和原型链

判断一个变量是否为数组,变量instanceof Array

3.3 原型规则和实例

5条原型规则是学习原型链的基础   

(1)  所有的引用类型(数组,对象,函数)都具有对象特性,即可以自由扩展属性(除了null以外)

(2)  所有的引用类型(数组,对象,函数)都有一个_proto_属性(隐式原型),属性值是一个普通的对象。

(3)  所有的函数,都有一个prototype属性(显式原型),属性值也是一个普通对象。

(4)  所有的引用类型(数组,对象,函数)_proto_属性(隐式原型)值指向它的构造函数的“prototype" 属性值(显式原型)。

         var obj={};    obj._proto_ === Object.prototype

  (5)    当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)中寻找。   

 

JS变量类型和计算|| 原型和原型链

3.4 原型链

JS为了避免死循环将Object.prototype的__proto__设为null,所以到这里还没有找到的话就返回null。

JS变量类型和计算|| 原型和原型链

3.5 instanceof  

instanceof用于判断 引用类型 的变量属于哪个 构造函数的一个方法

JS变量类型和计算|| 原型和原型链

3.6 如何判断一个变量是数组类型?

答:通过instanceof判断, typeof无法判断是否是数组

var arr=[]

arr instanceof Array  //true 

3.7 写一个原型链继承的例子

用于理解

JS变量类型和计算|| 原型和原型链

3.8 描述new 一个对象的过程(考察构造函数)

(1)创建一个新对象

(2)this指向这个新对象

(3)执行代码,即对this赋值

(4)返回this

JS变量类型和计算|| 原型和原型链