美文网首页
你不知道的js摘录

你不知道的js摘录

作者: 冷暖自知_zjz | 来源:发表于2023-06-15 19:38 被阅读0次
  • 变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。

  • 字符串不可变是指字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符 串。而数组的成员函数都是在其原始值上进行操作。

  • NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误 情况,即“执行数学运算没有成功,这是失败后返回的结果” (NaN 是一个特殊值,它和自身不相等,是唯一一个非自反(自反,reflexive,即 x === x 不 成立)的值。而 NaN != NaN 为 true)

    // JavaScript 中的引用和其他语言中的引用 / 指针不同,它们不能指向别的变量 / 引用,只能指向值。
    function foo(x) {
    x.push( 4 );
    x;
    // 然后
    x = [4,5,6];
    x.push( 7 );
    x;
    }
    var a = [1,2,3];
    foo( a );
    a; // a现在输出啥

拆封

如果想要得到封装对象中的基本类型值,可以使用 valueOf() 函数:

var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );
a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true

构造函数 Function 只在极少数情况下很有用,比如动态定义函数参数和函数体的时候。

类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)。

最好还是使用 ES5 中新加入的静态方法 Date.now() 代替 new Date().getTime(); 使 用 new Date(..).getTime() 来获得指定时间的时间戳。

Symbol()函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

// 没有参数的情况
let s1 = Symbol();
let s2 = Symbol();

s1 === s2 // false

// 有参数的情况
let s1 = Symbol('foo');
let s2 = Symbol('foo');

s1 === s2 // false

如果 < 比较的两个值都是字符串, 就像在 b < c 中那样,那么比较按照字典顺序(即字典中的字母表顺序)进行。如果其中 一边或两边都不是字符串,就像在 a < b 中那样,那么这两个值的类型都转换为数字,然 后进行普通的数字比较。

将闭包看作“记忆”并在函数运行完毕后继续访问这个函数作用域(其变量)的一 种方法。

生成器为 JavaScript 函数引入了一种新的执行模式,其中生成器可以暂停在 yield 点上, 并在之后被异步继续。暂停与继续的能力使得生成器中同步的、看似连续的代码可以在后 台异步执行。通过这种方式,我们解决了回调的非线性、非局部跳转引发的代码混乱问 题,因而让我们的异步代码看似同步,更容易追踪。

es6

和传统的 var 声明变量不同,不管出 现在什么位置,var 都是归属于包含它的整个函数作用域。let 声明归属于块作用域,但是 直到在块中出现才会被初始化。

var funcs = [];
for (let i = 0; i < 5; i++) {
 funcs.push( function(){
 console.log( i );
 } );
}
funcs[3](); // 3

for 循环头部的 let i 不只为 for 循环本身声明了一个 i,而是为循环的每一次迭代都重新 声明了一个新的 i。这意味着 loop 迭代内部创建的闭包封闭的是每次迭代中的变量,就像 期望的那样。(const 可以用在 for、for..in 以及 for..of 循环的变量声明中(参见 2.9 节)。但如果想要 重新赋值就会抛出错误,比如 for 循环中常用的 i++。证明每循环一次就创建一个新的作用域) 如果试验同样的代码,只把 var i 放在 for 循环头部,得到的结果就会是 5 而不是 3,因 为在外层作用域中只有一个 i,这个 i 被封闭进去,而不是每个迭代的函数会封闭一个 新的 i。

const

常量不是对这个值本身的限制,而是对赋值的那个变量的限制。换句话说,这个值并没有 因为 const 被锁定或者不可变,只是赋值本身不可变。如果这个值是复杂值,比如对象或 者数组,其内容仍然是可以修改的。

{
 const a = [1,2,3];
 a.push( 4 );
 console.log( a ); // [1,2,3,4]
 a = 42; // TypeError!
}

变量 a 并不持有一个常量数组;相反地,它持有一个指向数组的常量引用。数组本身是可 以随意改变的。

var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, z = z + 1 ) {
 console.log( x, y, z );
}
foo(); // ReferenceError   z没有初始化报错



var controller = {
 makeRequest: (..) => {
 // ..
 this.helper(..); // this指向全局 
 },
 helper: (..) => {
 // ..
 }
};
controller.makeRequest(..);
// 尽管我们以 controller.makeRequest(..) 的形式调用,this.helper 引用还是会失败,因为
这里的 this 并不像平常一样指向 controller。那么它指向哪里呢?它是从包围的作用域中
词法继承而来的 this。在前面的代码中也就是全局作用域,其中 this 指向那个全局对象。

相关文章

  • js检测电脑字节顺序(endianness)

    摘录自exploringjs node.js的os模块也有endianness方法

  • JS原型

    最近一直在理解JS的原型------《你不知道的JS》--------《JS设计模式》 里面都讲JS的原型运作方式...

  • 你不知道的JS

    NaN == NaN; // false "0" == null; // false "0" == undefin...

  • 你不知道的js

    原型 构造器(函数)也是对象,也可以赋值属性,函数本身有个property属性指向对象原型 构造器生成的对象可以访...

  • 基础

    JS 你不知道的 js 上中下 JavaScript 设计 模式 与 开发 实践 JavaScript 语言精粹 ...

  • JS 中你不知道的 this

    this 误区 this 既不指向函数自身也不指向函数的词法作用域。this 实际上是在函数被调用时发生的绑定,它...

  • js -- 你不知道的addEventListener

    借《你不知道的JavaScript》书的名气,顾取《你不知道的addEventListener》标题 先监听几个事...

  • 你不知道的JS(一)

    1、RHS(Right-Hand-Side)查询与LHS(Left-Hand-Side)查询 “RHS 查询与简单...

  • 你不知道的js温习

    js循环双值 typeof 妙用,防范机制,不会导致未定义的变量报错 而是返回undefined 字符串方法 借用...

  • 你不知道的js技巧

    Object.defineProperty(obj,"size",{}) 对某个对象的属性进行额外扩展设置需要三个...

网友评论

      本文标题:你不知道的js摘录

      本文链接:https://www.haomeiwen.com/subject/zumlydtx.html