简述
JavaScript是一门弱类型语言,变量的数据类型取决于值的数据类型,每当值得数据类型改变,变量的数据类型也会跟着改变。js是一门单线程语言js会优先执行主线程任务,遇到异步请求或者是遇到宏任务,不会立即执行,而是放到任务栈中。js区分大小写。
数据类型
共有9种数据类型:
基本数据类型:number(数字),string(字符串),null(空对象),underfine(未定义),boolean(布尔),symbol(ES6中新引入,表示独一无二的值)
引用数据类型:object(对象),array(数组),function(函数)
underfine继承null,underfine==null结果为true;
对象中的属性可以通过点语法来获取,obj.name;或者通过中括号(中括号中放变量)来获取obj['name']
深拷贝和浅拷贝:只存在于引用数据类型中,引用数据类型中,变量存放的是地址,地址指向值。所以如果直接用‘=’赋值,如果改变某个变量的值,那另一个变量的值也会改变。浅拷贝表示仅拷贝引用地址,深拷贝则克隆对象的值。
实现深拷贝的方法 :通过json对象实现深拷贝(JSON.stringify,JSON.parse);Object.assign();lodash库中深拷贝方法等等
类型判断
typeof:判断数据类型
ps:对象、数组、null用typeof判断结构都为object。
比较运算符
当字符串比较时,判断的是第一位的大小‘123123’<'5'
对象
对象中的三种强制类型转换:Boolean()、String()、Number()
转布尔类型:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空的字符串 | ""(空字符串) |
Number | 任何非零数字(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 无 | undefined |
原型对象
在Object的构造函数的原型对象中的属性和方法都可以被Object构造函数的实例所继承。
Object原型中的所具有的任何属性和方法也同样存在于其他对象中,任何对象继承自Object。
总结:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,实例都包含一个指向原型对象的内部指针。
对象的静态方法
Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)
obj prop {}(descriptor)
对象的数据属性特性:
[[Configurable]]
表示是否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性(属性直接定义在对象中,默认为true)。 当为false时,不能重新定义不能使用delete删除。
[[Enumerable]]
表示能否通过for-in循环返回属性。(属性直接定义在对象中,默认为true)
[[Writable]]
表示能否修改属性的值。(属性直接定义在对象中,默认为true)
[[Value]]
包含这个属性的数据值 name:jacky
若用Object.defineProperty()来定义一个属性时,上面三个属性默认为false。
读取属性的特性
Object.getOwnPropertyDescriptor()
访问器属性的特性
通过Object.defineProperty()这个方法来定义
[[Get]]
在读取属性时调用的函数,默认值为undefined
[[Set]]
在写入属性时调用的函数,默认值为undefined
对象的序列化
对象序列化是指将对象的状态转换为字符串,也可以反序列化,将字符串还原为对象函数。
RegExp,Error对象,undefined值不能序列化和反序列化。
JSON.stringify(obj) 将对象序列化为JSON字符串,只能序列化对象可枚举的自有属性
JSON.parse(jsonStr) 反序列化