首页 > 代码库 > 【总结】有意思的web前端文章或题目(五)
【总结】有意思的web前端文章或题目(五)
1.预解析相关
(function() { console.log(typeof foo); console.log(typeof bar); var foo = ‘hello‘, bar = function() { return ‘world‘; }; function foo() { return ‘hello‘; }}());
结果:
functionundefined
文章地址:http://blogread.cn/it/article/6178
2.闭包相关
代码片段一:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());
结果:The Window
代码片段二:
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());
结果:My Object
文章地址:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
3.浅拷贝与深拷贝
浅拷贝:
function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c;}
深拷贝:
function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === ‘object‘) { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c;}
浅拷贝的问题:如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
4.js中怎么理解按位取反?
Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2; ~2 = -3;来看看~1的计算步骤:
将1(这里叫:原码)转二进制 =
00000001
按位取反 =
11111110
发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 =
10000001
末位加1取其补码 =
10000010
转换回十进制 =
-2
按位取反的运算规则这么奇怪并不是JavaScript独有的,而是所有的计算机语言都是这样的。这样做的主要原因是为了为了统一减法和加法,在计算机中,减法会变成加一个负数,而负数会以补码的形式存储。而这样主要是因为补码和数字的十进制数有这么转换关系,负数:
补码(x) = -x - 1
,正数:补码(x) = x
。
可参考:二进制如何转十进制,十进制如何转二进制
问题地址:https://segmentfault.com/q/1010000005697515
5.javascript语法之标签(label)
JavaScript语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
label: statement
标签可以是任意的标识符,但是不能是保留字,语句部分可以是任意语句。
标签通常与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语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。
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语句后面不使用标签,则只能进入下一轮的内层循环。
说明:
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。
break语句用于跳出代码块或循环。
continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
【总结】有意思的web前端文章或题目(五)