1、JavaScript的数据类型有哪些?
- 基本数据类型:
字符串(String)、数字(Number)、布尔(Boolean)、空值(Null)、未定义(Undefined)、Symbol。 - 引用数据类型:
对象(Object)、数组(Array)、函数(Function)。
在这里注意:Symbol 引入了一种新的原始数据类型,表示独一无二的值
2、null,undefined的区别?
- null表示一个对象被定义了,但存放了空指针,转换为数值时为0。
- undefined表示声明的变量未初始化,转换为数值时为NAN。
3、JS中变量的作用域是什么?
变量的作用域是程序中定义它的区域,JS变量只有两个作用域:
- 全局变量 :全局变量具有全局作用域,这意味着它在JS代码中的任何位置都可见
- 局部变量 :局部变量仅在定义它的函数中可见,函数参数始终是该函数的本地参数
4.栈和堆的区别
- 栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量等;
- 堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统释放。
5.判断数据类型
-
typeof 类型
-
instanceof 实例
-
constructor 构造函数
-
Array.isArray()是否为数组
-
Object.prototype.toString.call(obj)原型
typeof判断
instanceof判断
constructor判断
最精确
6.深拷贝和浅拷贝
深拷贝
浅拷贝
7.隐式转换
在js中,当运算符在运算时,如果两边数据(这里为啥不写数据类型呢是因为两边的类型不同其实也会发生隐式转换,往下看你会更加了解)不统一,CPU就无法计算,编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算,这种无需程序员手动转换,而由编译器自动转换的方式就称为隐式转换
- string类型
看到这种形式 ? + str (字符串连接符 + )就会发生转换为string 拼接其他类型的数据
console.log(1 + 'str');//1str
console.log(-1 + 'str');//-1str
console.log(0 + 'str');//0str
conlose.log(NaN+'str');//NaNstr
console.log(true + 'str');//truestr
console.log(false + 'str');//falsestr
console.log(null + 'str');//nullstr
console.log(undefined + 'str');//undefinedstr
//下面的这些后面会陆续讲到 现在看不太懂没有关系 属于坑三
console.log([] + 'str');//str
console.log([1, 2, 3] + 'str');//1,2,3str
console.log({} + 'str');//[object Object]str
console.log({ a: 1 } + 'str');//[object Object]str
- number类型
看到 ? + - * / % number 就会发生转换number 进行算术运算
console.log('' + 1)//'1'
console.log('a' + 1);//'a1'
console.log('1' + 1);//'11'
console.log(NaN + 1);//NaN
console.log(true + 1);//2
console.log(false + 1);//1
console.log(null + 1);//1
console.log(undefined + 1);//NaN
//这个和上面那个一样后面会陆续讲到,现在看不懂没有关系 属于坑三
console.log([] + 1)//1
console.log([1, 2, 3] + 1);//'1,2,31'
console.log({} + 1);//'[object Object]1'
console.log({ a: 1 } + 1);//'[object Object]1'
JavaScript的相等和严格相等
JavaScript有两个表示相等的运算符:“相等”(==)和“严格相等”( ===)
- 简单的说,他们的区别是相等运算符(==)比较两个值是否相等,严格相等运算符( ===)比较它们是否是“同一个值”。如果两个值不是同一类型,严格相等运算符( ===)直接返回false;相等运算符( == )会将它们转换成同一个类型,再用严格相等运算符进行比较。
- 换一种说法也可以这样来理解,相等(==)比较表面值是否相等,而不会进行类型的判断;而严格相等( ===)不仅会比较表面值是否相等,也会判断类型是否相等。
if判断
- if()中判断的是否为truely变量
- falsely变量:false “” 0 NaN undefined null
- 两次取反 !!a得到结果为false
- 除了falsely变量其他都为truely变量
逻辑与与逻辑或
JS中的逻辑或||符号:
从字面上来说,只有前后都是 false 的时候才返回 false,否则返回 true。
console.log(5 > 6|| 6 > 5) //返回true
5>6为false 但是 6>5为true 所以返回 true
总结:一真为真
console.log(A&&B)
A&&B
A为假(false) 结果为A,否则结果为B
判断对象
if(1&&1.2&&1.2.1){}
if(1?1.2?1.2.1){}
如果有1并且有1.2并且有1.2.1
if(1.2.1){}
原型与原型链
- 类名
创建对象实例的模板
本质上就是函数
构造函数用new来执行的函数 - 实例
class div() : 由类创建的对象 - prototype
每个函数都有一个prototype属性,被称为显示原型 - 2.proto 每个实例对象都会有__proto__属性,其被称为隐式原型
型prototype - 每个实例都要一个隐式原型__proto_
- 类显示原型protype等于其创建的实例的隐式原型__proto__
原型链
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
看代码:
function Parent(month){
this.month = month;
}
var child = new Parent('Ann');
console.log(child.month); // Ann
console.log(child.father); // undefined
查找对象实例的方法和属性时,先在自身找,找不到则沿着__proto__向上查找,__proto__形成的链条关系我们称为原型链(实现了js继承)
理论
-
什么是原型?
在js中,每当定义一个函数数据类型(Object、Function、Arrry、Date等)的时候都会自带一个prototype对象,这个对象就是我们说的原型。原型又分为显示原型和隐式原型
显示原型是函数里面的prototype属性,每个prototype原型都有一个constructor属性,指向它关联的构造函数。
隐式原型是实例化对象里面的__proto__属性,__proto__属性指向自身构造函数的显示原型prototype属性 -
什么是原型链
每一个实例化对象都有一个__proto__属性,而这个__proto__属性指向构造函数的原型对象,
原型对象上也有一个__proto__属性,就这样一层一层往上找,直到找到object.phototype,就这样查找的过程就叫原型链
proto prototype constructor的三角关系
函数在声明时会生成一个对象prototype 该对象中有一个constructor指向构造函数本身 当构造函数实例化后,
在实例化对象中会生成一个对象叫__proto__指向构造函数的prototype