首页 > 代码库 > 【总结】有意思的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. 将1(这里叫:原码)转二进制 = 00000001

  2. 按位取反 = 11111110

  3. 发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 = 10000001

  4. 末位加1取其补码 = 10000010

  5. 转换回十进制 = -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前端文章或题目(五)