We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
只有深入学精一门语言,学其他语言才能更好地举一反三,触类旁听。
从接触前端开发到现在已经将近 2 年了,最近又看了阮一锋写的: 《JavaScript 语言入门教程》 一书,重温 JavaScript 。
小汪将工作和面试遇到过的,没多少人知道的 JavaScript 技巧,却十分实用的技巧都总结在这里面,分享给大家 。
温故而知新,我们对技术应该有的态度是: Stay hungry ! Stay young !
JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
label: 语句
标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。
标签通常与 break 语句和 continue 语句配合使用,跳出特定的循环。
top: for (var i = 0; i < 3; i++){ for (var j = 0; j < 3; j++){ if (i === 1 && j === 1) break top; console.log('i=' + i + ', j=' + j); } } // i=0, j=0 // i=0, j=1 // i=0, j=2 // i=1, j=0
上面代码为一个双重循环区块,break 命令后面加上了 top 标签(注意,top 不用加引号),满足条件时,直接跳出双层循环。如果 break 语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。
标签也可以用于跳出代码块。
foo: { console.log(1); break foo; // 注意要加 break 才能退出 console.log('本行不会输出'); } console.log(2); // 1 // 2
上面代码执行到 break foo,就会跳出区块。
continue 语句也可以与标签配合使用。
top: for (var i = 0; i < 3; i++){ for (var j = 0; j < 3; j++){ if (i === 1 && j === 1) continue top; console.log('i=' + i + ', j=' + j); } } // i=0, j=0 // i=0, j=1 // i=0, j=2 // i=1, j=0 // i=2, j=0 // i=2, j=1 // i=2, j=2
上面代码中,continue 命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮 外层循环。 如果 continue 语句后面不使用标签,则只能进入下一轮的 内层循环。
小汪经过实践得出以下用途。
用途:
先来道面试题:
console.log(typeof window) console.log(typeof {}) console.log(typeof []) console.log(typeof null)
答案:
"object" "object" "object" "object"
上面代码中,null 返回 object 。这是由于历史原因造成的,且一切原型链的终点都是 null。 空数组( [] )的类型也是 object,这表示在 JavaScript 内部,数组本质上只是一种特殊的对象。而 instanceof 运算符可以区分数组和对象。
var o = {}; var a = []; o instanceof Array // false a instanceof Array // true
经常会有面试官问:null 与 undefined 的区别 ?
区别:
Number(null) // 0 5 + null // 5 Number(undefined) // NaN 5 + undefined // NaN
对于 null 和 undefined,大致可以像下面这样理解。
null 表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入 null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入 null ,表示未发生错误。
undefined 表示“未定义”,下面是返回 undefined 的典型场景。
// 变量声明了,但没有赋值 var i; i // undefined // 调用函数时,应该提供的参数没有提供,该参数等于 undefined function f(x) { return x; } f() // undefined // 对象没有赋值的属性 var o = new Object(); o.p // undefined // 函数没有返回值时,默认返回 undefined function f() {} f() // undefined
注意,布尔值转换的时候,空数组([])和空对象({})对应的布尔值,都是true。
if ([]) { console.log('true'); } // true if ({}) { console.log('true'); } // true
JavaScript 内部,所有数字都是以 64 位浮点数形式储存,即使整数也是如此。所以,1 与 1.0 是相同的,是同一个数。
1 === 1.0 // true
JavaScript 语言的底层根本没有整数,所有数字都是小数( 64 位浮点数)。容易造成混淆的是,某些运算只有整数才能完成,此时 JavaScript 会自动把 64 位浮点数,转成 32 位整数,然后再进行运算。
由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。
例如:
0.1 + 0.2 === 0.3 // false 0.3 / 0.1 // 2.9999999999999996 (0.3 - 0.2) === (0.2 - 0.1) // false 2.22 + 2.21 // 4.43 3.45 + 1.11 // 4.5600000000000005 2.22 + 2.24 // 4.460000000000001
但是商品计算金额的时候,金额的结果一般都是保留两倍小数点的,那怎么办呢?
可以用 toFixed 解决:
var a = 2.22 + 2.24 // 4.460000000000001 var result = (a).toFixed(2) // 4.46
for...in 循环用来遍历一个对象的全部属性(包括可遍历的继承的属性)。但是,一般情况下,都是只想遍历对象自身的属性,所以使用 for...in 的时候,应该结合使用 hasOwnProperty 方法,在循环内部判断一下,某个属性是否为对象自身的属性。
var person = { name: '老张' }; for (var key in person) { if (person.hasOwnProperty(key)) { console.log(key); } } // name
重大事件:2017年11月,所有主流浏览器全部支持 WebAssembly,这意味着任何语言都可以编译成 JavaScript,在浏览器运行。
前端还是很有未来的 !!!
下节内容:细数 JavaScript 实用黑科技(二) 。
如果你觉得该文章对你有帮助,欢迎到我的 github star 一下,谢谢。
github 地址
参考教程: 《JavaScript 语言入门教程》
你以为本文就这么结束了 ? 精彩在后面 !!!
The text was updated successfully, but these errors were encountered:
biaochenxuying
No branches or pull requests
前言
只有深入学精一门语言,学其他语言才能更好地举一反三,触类旁听。
从接触前端开发到现在已经将近 2 年了,最近又看了阮一锋写的: 《JavaScript 语言入门教程》 一书,重温 JavaScript 。
小汪将工作和面试遇到过的,没多少人知道的 JavaScript 技巧,却十分实用的技巧都总结在这里面,分享给大家 。
温故而知新,我们对技术应该有的态度是: Stay hungry ! Stay young !
1. 标签(label)
JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。
标签通常与 break 语句和 continue 语句配合使用,跳出特定的循环。
上面代码为一个双重循环区块,break 命令后面加上了 top 标签(注意,top 不用加引号),满足条件时,直接跳出双层循环。如果 break 语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。
标签也可以用于跳出代码块。
上面代码执行到 break foo,就会跳出区块。
continue 语句也可以与标签配合使用。
上面代码中,continue 命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮 外层循环。 如果 continue 语句后面不使用标签,则只能进入下一轮的 内层循环。
小汪经过实践得出以下用途。
用途:
2. 区分数组和对象
先来道面试题:
答案:
上面代码中,null 返回 object 。这是由于历史原因造成的,且一切原型链的终点都是 null。
空数组( [] )的类型也是 object,这表示在 JavaScript 内部,数组本质上只是一种特殊的对象。而 instanceof 运算符可以区分数组和对象。
3. null, undefined 和布尔值
经常会有面试官问:null 与 undefined 的区别 ?
区别:
3.1 用法和含义
对于 null 和 undefined,大致可以像下面这样理解。
null 表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入 null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入 null ,表示未发生错误。
undefined 表示“未定义”,下面是返回 undefined 的典型场景。
注意,布尔值转换的时候,空数组([])和空对象({})对应的布尔值,都是true。
4. 数值
JavaScript 内部,所有数字都是以 64 位浮点数形式储存,即使整数也是如此。所以,1 与 1.0 是相同的,是同一个数。
JavaScript 语言的底层根本没有整数,所有数字都是小数( 64 位浮点数)。容易造成混淆的是,某些运算只有整数才能完成,此时 JavaScript 会自动把 64 位浮点数,转成 32 位整数,然后再进行运算。
由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。
例如:
但是商品计算金额的时候,金额的结果一般都是保留两倍小数点的,那怎么办呢?
可以用 toFixed 解决:
5. Object 属性的遍历
for...in 循环用来遍历一个对象的全部属性(包括可遍历的继承的属性)。但是,一般情况下,都是只想遍历对象自身的属性,所以使用 for...in 的时候,应该结合使用 hasOwnProperty 方法,在循环内部判断一下,某个属性是否为对象自身的属性。
最后
重大事件:2017年11月,所有主流浏览器全部支持 WebAssembly,这意味着任何语言都可以编译成 JavaScript,在浏览器运行。
前端还是很有未来的 !!!
下节内容:细数 JavaScript 实用黑科技(二) 。
如果你觉得该文章对你有帮助,欢迎到我的 github star 一下,谢谢。
github 地址
参考教程: 《JavaScript 语言入门教程》
你以为本文就这么结束了 ? 精彩在后面 !!!
The text was updated successfully, but these errors were encountered: