03 2020 档案
摘要:1、是这样的,不同的对象的底层都表示为二进制,在 js 中二进制前三位都为 0 的话会判断为 object 的类型, null 的二进制是全 0,自然前三位也是0所以执行 typeof 时会返回 ‘object’ 2、 var myArray = [1,2,3]; var it = myArray[
阅读全文
摘要:for 循环可以遍历数组 var myArray = [1,2,3]; for(var i=0; i<myArray.length; i++) { console.log(myArray[i]) } // 1 2 3 ES5 增加了数组的辅助迭代器,包括 forEach(...)、every(...
阅读全文
摘要:myObject.a 的属性访问返回值可能是 undefined,但是这个值有可能是属性中存储的 undefined,也可能是因为属性不存在所以返回 undefined var myObject = { a: 2 } ('a' in myObject); // true ('b' in myObje
阅读全文
摘要:对象默认的[[Put]] 和 [[Get]] 操作分别可以控制属性值的设置和获取 可以使用 getter 和 setter 部分改写默认操作,但是只能应用在单个属性上。当你给一个属性定义 getter、setter 或者两者都有时,这个属性会被定义为 “访问描述符”。对于访问描述符来说,会忽略它们的
阅读全文
摘要:[[Get]] 对象访问在实现上有个微妙却非常重要的细节 var myObject = { a: 2 } myObject.a; // 2 myObject.a 是一次属性访问,在实现上,myObject.a 在 myObject 上实际上实现了 [[Get]] 操作(有点像函数调用:[[Get]]
阅读全文
摘要:JS 程序中很少需要深不可变性。有些特殊情况可能需要这样做。如果发现需要密封或者冻结所有的对象,那重新思考一下程序的设计,让它能更好地应对对象值的改变。 对象常量 结合 writable: false 和 configurable: false 就可以创建一个真正的常量属性,不可修改,重定义或者删除
阅读全文
摘要:从 ES5 开始,所有的属性都具备了属性描述符 var myObject = { a: 2 } Object.getOwnPropertyDescriptor(myObject, 'a') // {value: 2, writable: true, enumerable: true, configu
阅读全文
摘要:JS 初学者最常见的问题之一就是如何复制一个对象。看起来应该有一个内置的 copy() 方法,实际上比想象中的更复杂,我们无法选择一个默认的复制算法 function anotherFunction(){/** ... */}; var anotherObject = { c: true }; va
阅读全文
摘要:数组有一套更加结构化的值存储机制。数组期望的是数值下标,也就是值存储的位置,通常被称为索引,是整数 var myArray = ['foo', 42, 'bar']; myArray.length; // 3 myArray[0]; // 'foo' myArray[2]; // 'bar' 数组也
阅读全文
摘要:如果访问的对象属性是一个函数,通常被称为‘方法’,把‘属性访问’说成了‘方法访问’。从技术角度来说,函数永远不会‘属于’一个对象,把对象内部引用的函数称为‘方法’似乎有些不妥。函数和对象的关系最多也只能说是间接关系 属性访问返回的函数和其他函数没有任何区别,除了可能发生的隐式绑定 this func
阅读全文
摘要:如果你需要通过表达式来计算属性名, [] 操作符就派上用场了。ES6 中使用 [] 包裹一个表达式来当作属性名 var prefix = 'foo'; var myObject = { [prefix + 'bar']: 'hello', [prefix + 'baz']: 'world', } m
阅读全文
摘要:存储在对象容器内部的是这些属性的名称,它们就像指针(从技术角度来说是引用)一样,指向这些值真正的存储位置。 var myObject = { a: 2 } myObject.a; // 2 myObject['a']; // 2 . 语法通常被称为‘属性访问’,[] 语法通常被称为‘键访问’。这两种
阅读全文
摘要:JavaScript 还有一些对象子类型,通常被称为内置对象 String Number Boolean 这三个内置对象的名字看起来和简单基础类型一样,实际上它们的关系更复杂 Object Function Array Data RegExp Error 这些内置函数可以当作构造函数来使用,从而构造
阅读全文
摘要:对象可以通过两种形式定义,文字(声明)形式 和 构造形式 文字语法 var myObj = { key: value, // ... } 构造形式 var myObj = new Object(); myObj.key = value; 文字形式和构造形式生成的对象是一样的,唯一的区别是,文字形式可
阅读全文
摘要:this 的四条绑定规则包含所有正常的函数。ES6 中箭头函数是一种无法使用这四条规则的特殊函数类型,他是根据外层作用域来决定 this 。箭头函数不是使用 function 关键字定义,而是使用 => 我们看看箭头函数的词法作用域 function foo(){ return (a) => { c
阅读全文
摘要:你有可能有意或者无意地创建一个函数的“间接引用”,在这个情况下,调用这个函数会应用默认规则 间接引用最容易在赋值时发生: function foo(){ console.log(this.a); } var a = 2; var o = { a: 3, foo: foo}; var p = { a:
阅读全文
摘要:规则总有例外,这里也一样。如果你把 null 或者 undefined 作为 this 的绑定对象传入 call、apply 或者 bind,应用的是默认绑定规则 function foo(){ console.log(this.a); } var a = 2; foo.call(null); //
阅读全文
摘要:我们首先来看下隐式绑定和显示绑定哪个优先级更高 function foo(){ console.log(this.a) } var obj1 = { a: 2, foo: foo } var obj2 = { a: 3, foo: foo } obj1.foo(); // 2 obj2.foo();
阅读全文
摘要:在传统的面向类的语言中,“构造函数“是类中的一些特殊方法,使用 new 初始化类时会调用类中的构造函数。通常的形式是这样的 something = new MyClass(..); 然而 JavaScript 中 new 的机制实际上和面向类的语言不同。它们只是被 new 操作符调用的普通函数而已。
阅读全文
摘要:隐式绑定是必须在一个对象内部包含一个指向函数的属性,并通过这个属间接引用函数,从而把 this 间接隐式绑定到这个对象上。 显示绑定是通过 call() 和 apply() 方法。它们的第一个参数是一个对象,它们会把这个对象绑定到 this. call function foo() { consol
阅读全文
摘要:默认绑定 最常用的调用类型,独立函数调用,默认规则 function foo() { console.log(this.a); } var a = 2 foo(); // 2 如果使用严格模式,全局对象将无法使用默认绑定,this 会绑定到 undefined function foo() { 'u
阅读全文
摘要:我们排除了一些对于 this 对错误理解并且明白了每个函数的 this 是在调用时被绑定的,完全取决于函数的调用位置。寻找调用位置就是寻找“函数被调用的位置”,但是做起来并没有这么简单,因为某些编程模式可能会隐藏真正的调用位置 最重要的是要分析调用栈,就是为了到达当前执行位置所调用的所有函数 fun
阅读全文
摘要:第一种误解:this 理解成指向函数本省,函数看作一个对象,this 并不像我们所想的那样指向函数本身。 function foo(num){ console.log('foo: ' + num); this.count++; } foo.count = 0; var i; for(i=0; i<1
阅读全文
摘要:var me = { name: 'Kyle' }; var you = { name: 'Reader' } function identify(){ return this.name.toUpperCase(); } function speak(){ var greeting = "Hello
阅读全文