基础知识 js
Object没有prototype属性
|
__proto__ |
prototype |
Object |
有 |
无 |
Function |
有 |
有 |
几种Object方法的小结:
Object方法 |
返回值 |
涉及属性 |
说明 |
Object.entries() |
数组 |
自有&&可枚举 |
数组元素是属性名称-属性值 |
Object.keys() |
数组 |
自有&&可枚举 |
数组元素是属性名称 |
Object.values() |
数组 |
自有&&可枚举 |
数组元素是属性值 |
Object.getOwnPropertyNames() |
数组 |
自有&&(可枚举+不可枚举) |
数组元素是属性名称 |
for-in |
数组 |
(自有+原型链)&&可枚举 |
数组元素是属性名称 |
问题 |
函数表达式有什么用? |
解答 |
唯一的用处是附加为已有组件/Object的方法 |
获取函数名称
function test6 (){ console.log(arguments.callee.name); }
test6(); |
浅拷贝和深拷贝
浅拷贝:假如源对象的属性值是一个对象的引用,拷贝之后的目标对象值也只能是引用,指向原来对象。
类似于:js 中的引用类似于C++中的指针,复制引用类型的属性值,如同复制指针类型的属性值。复制之后,新生成了一个指针,但指针值不变,仍然指向原有对象。
1 let obj1 = { a: 0 , b: { c: 0}}; 2 let obj2 = Object.assign({}, obj1); 3 console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} 4 5 obj1.a = 1; 6 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} 7 console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} 8 9 obj2.a = 2; 10 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} 11 console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}} 12 13 obj2.b.c = 3; 14 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} 15 console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
1 obj1 = { a: 0 , b: { c: 0}};
2
3 // 生成一个完全彻底的新对象
4 let obj3 = JSON.parse(JSON.stringify(obj1));
5 obj1.a = 4;
6 obj1.b.c = 4;
7 console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
const 实际上保证的是不是变量的值不得改动,而是变量指向的内存地址不得改动。
对于简单数据类型(数值,字符串,布尔值),值就保存在指向的内存地址等同于常量。
对于复合类型的数据(对象和数组)变量指向的内存地址只是一个指针,只能保证指针是不变的,不保证指针指向的内容是不变的.
ES6 - 解构
参考此处:ES6非常棒的特性-解构
基本描述
解构的目的是简化变量的获取和使用,减少程序代码的书写量。
解构就是从字符串、数组或者object中提取一个或一些元素的值并存入相对更简单的变量中。
要点1:解构的数据来源是能够存放多个元素的对象,例如字符串存放多个字符,数组存放多个元素,object存放多个属性。
要点2:解构的数据目的变量一定比解构源更简单。
解构带上默认值
如果我们要解构的对象的属性没有值,甚至属性不存在。这个时候,我们需要一个默认值,通常我们可能会这么写:
let name = person.name || "default name";
语言特点
C++是一门让人越来越来清晰的语言,C++是一门清晰的语言
js是一门让人越来越来糊涂的语言,js是一门稀里糊涂的语言
相关疑问
js 为何需要不可枚举属性?
js 在何处只能用函数表达式,无法用函数声明