某某茶叶有限公司欢迎您!
金沙棋牌在线 > 服务器&运维 > 一些javascript一些题目的解析_javascript技巧_脚本之家

一些javascript一些题目的解析_javascript技巧_脚本之家

时间:2019-11-27 20:39

下面是我关于这些题目的,一些关于自己的理解. 如果有什么不同的意见或者见解,欢迎拍砖. 复制代码 代码如下: { return typeof arguments; })(); 这个题目比较简单, 只要大家不觉得 arguments 是 array ,就可以了. 返回是 object. 复制代码 代码如下: var f = function g(){ return 23; }; typeof g(); 翻翻 aiming 的书,会发现里面对function 的解释, 以及几种创建方式有比较完全的描叙的, 这个陷阱,在下面的多个题目中有出现. 小心. 返回是 undefined. 复制代码 代码如下: { delete x; return x; }); Javascript 的delete, 删除的不是引入或者指向的对象. 而是对象本身. /* 资料 delete 运算符 从对象中删除一个属性,或从数组中删除一个元素。 delete expression expression 参数是一个有效的 JScript 表达式,通常是一个属性名或数组元素 所以,这里的形参的改变, 与他是没关系的. */ 关于delete的具体解析,有园友给出了那个题目部分原本的解释,粗心了没去看,呵呵 返回 1. 复制代码 代码如下: var y = 1, x = y = typeof x; x; 这个部分有个小陷阱. 呵呵. x= undefined , 大家知道. 然后 typeof x, 实际上也就是 typeof "undefined". 呵呵 返回的,当然是 string 了. 复制代码 代码如下: { return typeof f{ return 1; }); 恩, 陷阱又来拉.哈哈. 此f 是什么呢? 于形参是没关系的,而且,你也取不到的. 所以, 形参没任何改变. 所以, 返回 number . 复制代码 代码如下: var foo = { bar: function() { return this.baz; }, baz: 1 }; { return typeof arguments[0]; 这个地方. 主要是考虑的 this的上下文. 传入的是 foo.bar,而非他的父级. 所以, 返回 undefined . 复制代码 代码如下: var foo = { bar: function(){ return this.baz; }, baz: 1 } typeof ; 有了上面那个题目, 这个题目也就可以理解了. 所以, 返回 undefined . 复制代码 代码如下: var f = { return "1"; }, function g; typeof f; 这里, 考究的是 是返回最后一个. 返回 Number. 复制代码 代码如下: var x = 1; if { x += typeof f; } x; if 里的东西,是肯定可以执行的.因为他是一个实际的存在. 非null|underfined的对象,在if下都是可以继续的 . 但是, 和上面的都是一样的原理, f ,却是不存在的. 所以 返回 1undefined. 复制代码 代码如下: var x = [typeof x, typeof y][1]; typeof typeof x; 这里 ,typeof y ,undefined. 然后, typeof typeof undefined => vtypeof "undefined" 返回 "string". 复制代码 代码如下: { return typeof foo.bar; }); 呵呵, 这里是个小陷阱, 如果看得太快了容易进去的哦. 简单的描叙下, var fo = {foo:{bar:1}}; function; return typeof foo.bar ==> return typeof fo.bar 所以返回 "undefined". 复制代码 代码如下: { function f(){ return 1; } return f{ return 2; } })(); 这个题目, 是关于编译器对function的解析了. 于return 没关系. 当他把return 只看成一个string的时候, 编译器已经解析过了所有的function . 与var f = function(){} 这样的是不同的. 所以, 会返回 2. 复制代码 代码如下: function f(){ return f; } new f() instanceof f; 这个地方理解不够, 瓶子给出的解释貌似看得过去 new f() 得到的是f 的本身, 而不是一个new的对象, 因此,不是f 的实例. 所以, 返回 false. with (function length; 关于 with 这块, 如果我把 with也看成一个function. 那这个length, 就是with的形参长度了. 返回 2. 好了. 看来很多关于js的问题, 其实还是需要梳理下的. aiming 大大的书,关于这部分的讲解很给力. 可以让人绕过一些陷阱和问题.剩下的就是一些自己的测试了. 这些题目并不能够完全的反映出一个人的js能力, 但是至少能够让人知道编译器是怎么样去处理js的

function add {________}; alert; //填空,使结果为9 解法一, 复制代码 代码如下: //貘大 function add { var c = 0; return function { c = c + x ; arguments.callee.toString = function(){ return c; }; return arguments.callee; }; 解法二, 复制代码 代码如下: //三桂 function add { return function{ return function{ return x+y+z; } } }; alert; 解法三, 复制代码 代码如下: //司徒正美 function add { if{ add.i = a }else { add.i += a; } add.valueOf = add.toString = function(){ return add.i } return add; } alert 其实上题就是考curry,详见我另一篇博文。 如果你有不同的解法,也请多多指教!

1、原码、反码、补码,正数减法转补码加法 js 在进行二进制运算时,使用 32 位二进制整数,由于 js 的整数都是有符号数,最高位0表示正数,1表示负数,因此,js 二进制运算中使用的整数表达范围是 复制代码 代码如下: -Math.pow ~ Math.pow-1 // -2147483648 ~ 2147483647 原码:最高位 0 表示正,1表示负,其余 31 位是该数的绝对值的二进制形式 反码:正数反码与原码相同,负数反码是原码符号位不变,其余31位取反 补码:正数补码与原码相同,负数补码为反码加 1 (符号位参与运算,其实只有求 -0 的补码才涉及最高位进位,因此不用担心在反码加1时由于符号位参与运算进位而使

event对象只在事件发生的过程中才有效。 event的某些属性只对特定的事件有意义。比如,fromElement 和 toElement 属性只对 onmouseover 和 onmouseout 事件有意义。 例子 下面的例子检查鼠标是否在链接上单击,并且,如果shift键被按下,就取消链接的跳转。

  • 变 +)。 +0 的反码:32个0 ,按正数处理,原码、反码、补码都是0。 -0 的反码:最高位1,其余位由 +0 原码取反,得到 32 个 1 -0 的补码:其反码是 32 个 1 加 1,最高位溢出被舍弃,得到 32 个0 因此,正负 0 的补码都是 0. 由负数的补码求他的绝对值补码:负二进制数的绝对值,只要各位取反,再加1,就得到其绝对值。 计算机在处理加减运算时,使用补码进行运算,减法被视为加上一个负数,在处理负数时,用负数的补码进行加法可以即可得到正确运算结果,补码是为了统一加减运算而生的。 正数减法转补码加法的原理是 32 位数溢出: 对于32 位二进制正整数来说,其模为 复制代码 代码如下: Math.pow = 4294967296 32 位正整数最大表达范围是 4294967296 - 1 ,达到 4294967296 这个值就要进位到33位,33 位是溢出位被丢弃,只得到32 个0(这个道理跟表盘上 0 点 和12 点的时针指在同一个位置是一样的,表盘以 12 为模),因此,一个数逐渐增大,一旦超出 4294967296-1 的数 M 就可以表示为 M%4294967296 而负数 -M 可以表示为一个正数: 4294967296 - M(这个正数就是负数的补码对应的二进制正整数,负数的补码按32位二进制数,与他的原码相加刚好等于模 ),道理跟表盘一样,11点和负1点指在同一个位置。 以 -3 为例: 复制代码 代码如下: +.slice; // |-3| 的二进制数,即原码 原码 = 00000000000000000000000000000011; 反码 = 11111111111111111111111111111100; //原码符号位为1,其余位取反 补码 = 11111111111111111111111111111101; //反码加1因为反码由正数形式的原码低31位取反得到,因此这两个数的低31位全都是1,加上反码符号位1,得到32 个1 那么,有 补码+原码 = +1 = 1+ //因为反码由正数形式的原码的低31位取反加上符号位1得到,因此这两个数的和的低31位全都是1,加上反码符号位1,得到32 个1 = Math.pow = 4294967296 //这正是32位二进制数的模, 跟 |-1|+11 = 12 原理一样 这就是: 正数减法 -> 负数加法 -> 补码加法 的过程。 2、位运算 因为 js 的整数默认是带符号正数,所以在为运算中,只能使用 31 位,开发者是不能访问最高位的。 位运算只发生在整数上,因此一个非浮点数参与位运算之前会被向下取整。 为了避免访问符号位, javascript 在现实 负数的 二进制时,转换为 符号及 其绝对值的二进制,如: 复制代码 代码如下: ;// "-1111011" 按位取反: 一元运算, 1 变0,0变1 ,如 ~123 ; //-124 可以验证一下这个过程:正数取反,符号位为负,所以结果是一个负数,根据 Math.pow - M 可以表示成 -M,可以按下面方法计算 复制代码 代码如下: parseInt+ .slice.replace { return -Math.pow // -124 ,如果是负数减 Math.pow 需要注意的是, javascript 位运算都是有符号的,因此达到 32 位,其最高位将作为 符号位,取反时应得到正数 的补数--两个数相加得到模,称这两个数互为补数)。 对整数 M 按位取反可以这样算: 复制代码 代码如下: +Math.pow 按位与:两个数的相同位,都是 1 返回1 ,否则返回0 复制代码 代码如下: &234 = 106 "00000000000000000000000001111011" "00000000000000000000000011101010"

Cancels Links