只有深刻学精一门语言,学其余语言才能更好地触类旁通,触类旁听。javascript
从接触前端开发到如今已经将近 2 年了,最近又看了阮一锋写的: 《JavaScript 语言入门教程》 一书,重温 JavaScript 。html
小汪将工做和面试遇到过的,没多少人知道的 JavaScript 技巧,却十分实用的技巧都总结在这里面,分享给你们 。前端
温故而知新,咱们对技术应该有的态度是: Stay hungry ! Stay young !vue
JavaScript 语言容许,语句的前面有标签(label),至关于定位符,用于跳转到程序的任意位置,标签的格式以下。java
label: 语句
标签能够是任意的标识符,但不能是保留字,语句部分能够是任意语句。node
标签一般与 break 语句和 continue 语句配合使用,跳出特定的循环。react
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 语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。git
标签也能够用于跳出代码块。github
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 一下,谢谢。
参考教程: 《JavaScript 语言入门教程》
你觉得本文就这么结束了 ? 精彩在后面 !!!
对 全栈修炼 有兴趣的朋友能够扫下方二维码关注个人公众号
我会不按期更新有价值的内容,长期运营。
关注公众号并回复 福利 可领取免费学习资料,福利详情请猛戳: Python、Java、Linux、Go、node、vue、react、javaScript