常见的JavaScript面试题
<h3 id="使用-typeof-bar-object-判断-bar-是不是一个对象有神马潜在的弊端如何避免这种弊端">1、使用 typeof bar === "object" 判断 bar 是不是一个对象有神马潜在的弊端?如何避免这种弊端?</h3><p>使用 typeof 的弊端是显而易见的(这种弊端同使用 instanceof):</p>
<div class="cnblogs_code">
<pre>let obj =<span style="color: rgba(0, 0, 0, 1)"> {};
let arr </span>=<span style="color: rgba(0, 0, 0, 1)"> [];
console.log(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span> obj === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(128, 0, 0, 1)">'</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> arr === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(128, 0, 0, 1)">'</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> <span style="color: rgba(0, 0, 255, 1)">null</span> === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">object</span><span style="color: rgba(128, 0, 0, 1)">'</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span></pre>
</div>
<p>从上面的输出结果可知,typeof bar === "object" 并不能准确判断 bar 就是一个 Object。可以通过 <code>Object.prototype.toString.call(bar) === ""</code> 来避免这种弊端:</p>
<div class="cnblogs_code">
<pre>let obj =<span style="color: rgba(0, 0, 0, 1)"> {};
let arr </span>=<span style="color: rgba(0, 0, 0, 1)"> [];
console.log(Object.prototype.toString.call(obj));</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span>
console.log(Object.prototype.toString.call(arr));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span>
console.log(Object.prototype.toString.call(<span style="color: rgba(0, 0, 255, 1)">null</span>));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span></pre>
</div>
<p>另外,为了珍爱生命,请远离 ==:<br>珍爱生命</p>
<p>而 [] === false 是返回 false 的。</p>
<h3 id="下面的代码会在-console-输出神马为什么">2、下面的代码会在 console 输出神马?为什么?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(function(){
</span><span style="color: rgba(0, 0, 255, 1)">var</span> a = b = <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
})();
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">a defined? </span><span style="color: rgba(128, 0, 0, 1)">"</span> + (<span style="color: rgba(0, 0, 255, 1)">typeof</span> a !== <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">undefined</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">b defined? </span><span style="color: rgba(128, 0, 0, 1)">"</span> + (<span style="color: rgba(0, 0, 255, 1)">typeof</span> b !== <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">undefined</span><span style="color: rgba(128, 0, 0, 1)">'</span>));</pre>
</div>
<p>这跟变量作用域有关,输出换成下面的:</p>
<div class="cnblogs_code">
<pre>console.log(b); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3</span>
console,log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> a); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">undefined</span></pre>
</div>
<p>拆解一下自执行函数中的变量赋值:</p>
<div class="cnblogs_code">
<pre>b = <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> a = b;</pre>
</div>
<p>所以 b 成了全局变量,而 a 是自执行函数的一个局部变量。</p>
<h3 id="下面的代码会在-console-输出神马为什么-1">3、下面的代码会在 console 输出神马?为什么?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> myObject =<span style="color: rgba(0, 0, 0, 1)"> {
foo: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bar</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
func: function() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> self = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">;
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">outer func:this.foo = </span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.foo);
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">outer func:self.foo = </span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> self.foo);
(function() {
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">inner func:this.foo = </span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.foo);
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">inner func:self.foo = </span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> self.foo);
}());
}
};
myObject.func();</span></pre>
</div>
<p>第一个和第二个的输出不难判断,在 ES6 之前,JavaScript 只有函数作用域,所以 func 中的 IIFE 有自己的独立作用域,并且它能访问到外部作用域中的 self,所以第三个输出会报错,因为 this 在可访问到的作用域内是 undefined,第四个输出是 bar。如果你知道闭包,也很容易解决的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(function(test) {
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">inner func:this.foo = </span><span style="color: rgba(128, 0, 0, 1)">"</span> + test.foo);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">'bar'</span>
console.log(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">inner func:self.foo = </span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> self.foo);
}(self));</span></pre>
</div>
<p>如果对闭包不熟悉,可以戳此:从作用域链谈闭包</p>
<h3 id="将-javascript-代码包含在一个函数块中有神马意思呢为什么要这么做">4、将 JavaScript 代码包含在一个函数块中有神马意思呢?为什么要这么做?</h3>
<p>换句话说,为什么要用立即执行函数表达式(Immediately-Invoked Function Expression)。</p>
<p>IIFE 有两个比较经典的使用场景,一是类似于在循环中定时输出数据项,二是类似于 JQuery/Node 的插件和模块开发。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < <span style="color: rgba(128, 0, 128, 1)">5</span>; i++<span style="color: rgba(0, 0, 0, 1)">) {
setTimeout(function() {
console.log(i);
}, </span><span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<p>上面的输出并不是你以为的0,1,2,3,4,而输出的全部是5,这时 IIFE 就能有用了:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < <span style="color: rgba(128, 0, 128, 1)">5</span>; i++<span style="color: rgba(0, 0, 0, 1)">) {
(function(i) {
setTimeout(function() {
console.log(i);
}, </span><span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
})(i)
}</span></pre>
</div>
<p>而在 JQuery/Node 的插件和模块开发中,为避免变量污染,也是一个大大的 IIFE:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(function($) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">代码</span>
} )(jQuery);</pre>
</div>
<h3 id="在严格模式use-strict下进行-javascript-开发有神马好处">5、在严格模式('use strict')下进行 JavaScript 开发有神马好处?</h3>
<p>消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;<br>消除代码运行的一些不安全之处,保证代码运行的安全;<br>提高编译器效率,增加运行速度;<br>为未来新版本的Javascript做好铺垫。</p>
<h3 id="下面两个函数的返回值是一样的吗为什么">6、下面两个函数的返回值是一样的吗?为什么?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function foo1()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
bar: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
};
}
function foo2()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
{
bar: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
};
}</span></pre>
</div>
<p>在编程语言中,基本都是使用分号(;)将语句分隔开,这可以增加代码的可读性和整洁性。而在JS中,如若语句各占独立一行,通常可以省略语句间的分号(;),JS 解析器会根据能否正常编译来决定是否自动填充分号:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> test = <span style="color: rgba(128, 0, 128, 1)">1</span> + <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
console.log(test);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3</span></pre>
</div>
<p>在上述情况下,为了正确解析代码,就不会自动填充分号了,但是对于 return 、break、continue 等语句,如果后面紧跟换行,解析器一定会自动在后面填充分号(;),所以上面的第二个函数就变成了这样:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function foo2()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
{
bar: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
};
}</span></pre>
</div>
<p>所以第二个函数是返回 undefined。</p>
<h3 id="神马是-nan它的类型是神马怎么测试一个值是否等于-nan">7、神马是 NaN,它的类型是神马?怎么测试一个值是否等于 NaN?</h3>
<p>NaN 是 Not a Number 的缩写,JavaScript 的一种特殊数值,其类型是 Number,可以通过 isNaN(param) 来判断一个值是否是 NaN:</p>
<div class="cnblogs_code">
<pre>console.log(isNaN(NaN)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log(isNaN(<span style="color: rgba(128, 0, 128, 1)">23</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
console.log(isNaN(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ds</span><span style="color: rgba(128, 0, 0, 1)">'</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log(isNaN(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">32131sdasd</span><span style="color: rgba(128, 0, 0, 1)">'</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log(NaN === NaN); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
console.log(NaN === undefined); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
console.log(undefined === undefined); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> NaN); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">number</span>
console.log(Object.prototype.toString.call(NaN)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span></pre>
</div>
<p>ES6 中,isNaN() 成为了 Number 的静态方法:Number.isNaN().</p>
<h3 id="解释一下下面代码的输出">8、解释一下下面代码的输出</h3>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 128, 1)">0.1</span> + <span style="color: rgba(128, 0, 128, 1)">0.2</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0.30000000000000004</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">0.1</span> + <span style="color: rgba(128, 0, 128, 1)">0.2</span> == <span style="color: rgba(128, 0, 128, 1)">0.3</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span></pre>
</div>
<p>JavaScript 中的 number 类型就是浮点型,JavaScript 中的浮点数采用IEEE-754 格式的规定,这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024,每个浮点数占64位。但是,二进制浮点数表示法并不能精确的表示类似0.1这样 的简单的数字,会有舍入误差。</p>
<p>由于采用二进制,JavaScript 也不能有限表示 1/10、1/2 等这样的分数。在二进制中,1/10(0.1)被表示为 0.00110011001100110011…… 注意 0011 是无限重复的,这是舍入误差造成的,所以对于 0.1 + 0.2 这样的运算,操作数会先被转成二进制,然后再计算:</p>
<pre><code class="hljs dart"><span class="hljs-number">0.1 => <span class="hljs-number">0.0001 <span class="hljs-number">1001 <span class="hljs-number">1001 <span class="hljs-number">1001…(无限循环)
<span class="hljs-number">0.2 => <span class="hljs-number">0.0011 <span class="hljs-number">0011 <span class="hljs-number">0011 <span class="hljs-number">0011…(无限循环)</span></span></span></span></span></span></span></span></span></span></code></pre>
<p>双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100...因浮点数小数位的限制而截断的二进制数字,这时候,再把它转换为十进制,就成了 0.30000000000000004。</p>
<p>对于保证浮点数计算的正确性,有两种常见方式:</p>
<p>一是先升幂再降幂:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function add(num1, num2){
let r1, r2, m;
r1 </span>= (<span style="color: rgba(128, 0, 0, 1)">''</span>+num1).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">].length;
r2 </span>= (<span style="color: rgba(128, 0, 0, 1)">''</span>+num2).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">].length;
m </span>= Math.pow(<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">,Math.max(r1,r2));
</span><span style="color: rgba(0, 0, 255, 1)">return</span> (num1 * m + num2 * m) /<span style="color: rgba(0, 0, 0, 1)"> m;
}
console.log(add(</span><span style="color: rgba(128, 0, 128, 1)">0.1</span>,<span style="color: rgba(128, 0, 128, 1)">0.2</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0.3</span>
console.log(add(<span style="color: rgba(128, 0, 128, 1)">0.15</span>,<span style="color: rgba(128, 0, 128, 1)">0.2256</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0.3756</span></pre>
</div>
<p>二是是使用内置的 toPrecision() 和 toFixed() 方法,注意,方法的返回值字符串。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function add(x, y) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> x.toPrecision() +<span style="color: rgba(0, 0, 0, 1)"> y.toPrecision()
}
console.log(add(</span><span style="color: rgba(128, 0, 128, 1)">0.1</span>,<span style="color: rgba(128, 0, 128, 1)">0.2</span>));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">"0.10.2"</span></pre>
</div>
<h3 id="实现函数-isintegerx-来判断-x-是否是整数">9、实现函数 isInteger(x) 来判断 x 是否是整数</h3>
<p>可以将 x 转换成10进制,判断和本身是不是相等即可:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function isInteger(x) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> parseInt(x, <span style="color: rgba(128, 0, 128, 1)">10</span>) ===<span style="color: rgba(0, 0, 0, 1)"> x;
}</span></pre>
</div>
<p>ES6 对数值进行了扩展,提供了静态方法 isInteger() 来判断参数是否是整数:</p>
<div class="cnblogs_code">
<pre>Number.isInteger(<span style="color: rgba(128, 0, 128, 1)">25</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span>
Number.isInteger(<span style="color: rgba(128, 0, 128, 1)">25.0</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span>
Number.isInteger(<span style="color: rgba(128, 0, 128, 1)">25.1</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false</span>
Number.isInteger(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">15</span><span style="color: rgba(128, 0, 0, 1)">"</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false</span>
Number.isInteger(<span style="color: rgba(0, 0, 255, 1)">true</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false</span></pre>
</div>
<p>JavaScript能够准确表示的整数范围在 -2^53 到 2^53 之间(不含两个端点),超过这个范围,无法精确表示这个值。ES6 引入了Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER这两个常量,用来表示这个范围的上下限,并提供了 Number.isSafeInteger() 来判断整数是否是安全型整数。</p>
<h3 id="在下面的代码中数字-1-4-会以什么顺序输出为什么会这样输出">10、在下面的代码中,数字 1-4 会以什么顺序输出?为什么会这样输出?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(function() {
console.log(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
setTimeout(function(){console.log(</span><span style="color: rgba(128, 0, 128, 1)">2</span>)}, <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
setTimeout(function(){console.log(</span><span style="color: rgba(128, 0, 128, 1)">3</span>)}, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(</span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
})();</span></pre>
</div>
<p>这个就不多解释了,主要是 JavaScript 的定时机制和时间循环,不要忘了,JavaScript 是单线程的。详解可以参考 从setTimeout谈JavaScript运行机制。</p>
<h3 id="写一个少于-80-字符的函数判断一个字符串是不是回文字符串">11、写一个少于 80 字符的函数,判断一个字符串是不是回文字符串</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function isPalindrome(str) {
str </span>= str.replace(/\W/g, <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">).toLowerCase();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> (str == str.split(<span style="color: rgba(128, 0, 0, 1)">''</span>).reverse().join(<span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">));
}</span></pre>
</div>
<p>这个题我在 codewars 上碰到过,并收录了一些不错的解决方式,可以戳这里:Palindrome For Your Dome</p>
<h3 id="写一个按照下面方式调用都能正常工作的-sum-方法">12、写一个按照下面方式调用都能正常工作的 sum 方法</h3>
<div class="cnblogs_code">
<pre>console.log(sum(<span style="color: rgba(128, 0, 128, 1)">2</span>,<span style="color: rgba(128, 0, 128, 1)">3</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Outputs 5</span>
console.log(sum(<span style="color: rgba(128, 0, 128, 1)">2</span>)(<span style="color: rgba(128, 0, 128, 1)">3</span>));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Outputs 5</span></pre>
</div>
<p>针对这个题,可以判断参数个数来实现:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function sum() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> fir = arguments[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(arguments.length === <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> arguments[<span style="color: rgba(128, 0, 128, 1)">0</span>] + arguments[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> function(sec) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> fir +<span style="color: rgba(0, 0, 0, 1)"> sec;
}
}
}</span></pre>
</div>
<h3 id="根据下面的代码片段回答后面的问题">13、根据下面的代码片段回答后面的问题</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < <span style="color: rgba(128, 0, 128, 1)">5</span>; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> btn = document.createElement(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
btn.appendChild(document.createTextNode(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Button </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> i));
btn.addEventListener(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">click</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, function(){ console.log(i); });
document.body.appendChild(btn);
}</span></pre>
</div>
<p>1、点击 Button 4,会在控制台输出什么?<br>2、给出一种符合预期的实现方式</p>
<p>答:1、点击5个按钮中的任意一个,都是输出5<br>2、参考 IIFE。</p>
<h3 id="下面的代码会输出什么为什么">14、下面的代码会输出什么?为什么?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> arr1 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">john</span><span style="color: rgba(128, 0, 0, 1)">"</span>.split(<span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">); j o h n
</span><span style="color: rgba(0, 0, 255, 1)">var</span> arr2 =<span style="color: rgba(0, 0, 0, 1)"> arr1.reverse(); n h o j
</span><span style="color: rgba(0, 0, 255, 1)">var</span> arr3 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">jones</span><span style="color: rgba(128, 0, 0, 1)">"</span>.split(<span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">); j o n e s
arr2.push(arr3);
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">array 1: length=</span><span style="color: rgba(128, 0, 0, 1)">"</span> + arr1.length + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> last=</span><span style="color: rgba(128, 0, 0, 1)">"</span> + arr1.slice(-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">array 2: length=</span><span style="color: rgba(128, 0, 0, 1)">"</span> + arr2.length + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> last=</span><span style="color: rgba(128, 0, 0, 1)">"</span> + arr2.slice(-<span style="color: rgba(128, 0, 128, 1)">1</span>));</pre>
</div>
<p>会输出什么呢?你运行下就知道了,可能会在你的意料之外。</p>
<p>MDN 上对于 reverse() 的描述是酱紫的:</p>
<blockquote>
<p>Description<br>The reverse method transposes the elements of the calling array object in place, mutating the array, and returning a reference to the array.</p>
</blockquote>
<p>reverse() 会改变数组本身,并返回原数组的引用。</p>
<p>slice 的用法请参考:slice</p>
<h3 id="下面的代码会输出什么为什么-1">15、下面的代码会输出什么?为什么?</h3>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 128, 1)">1</span> +<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(</span><span style="color: rgba(128, 0, 128, 1)">1</span> ++<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(</span><span style="color: rgba(128, 0, 128, 1)">1</span> +-<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
console.log(</span>+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
console.log( </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">"</span> - <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">B</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
console.log( </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">"</span> - <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">B</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 128, 1)">2</span>);</pre>
</div>
<p>输出什么,自己去运行吧,需要注意三个点:</p>
<p>1、多个数字和数字字符串混合运算时,跟操作数的位置有关</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 128, 1)">2</span> + <span style="color: rgba(128, 0, 128, 1)">1</span> + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span>); / /‘<span style="color: rgba(128, 0, 128, 1)">33</span><span style="color: rgba(0, 0, 0, 1)">’
console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span> + <span style="color: rgba(128, 0, 128, 1)">2</span> + <span style="color: rgba(128, 0, 128, 1)">1</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">'321'</span></pre>
</div>
<p>数字字符串之前存在数字中的正负号(+/-)时,会被转换成数字</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> string</span>
console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> +<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">number</span></pre>
</div>
<p>同样,可以在数字前添加 '',将数字转为字符串。</p>
<p>2、</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> <span style="color: rgba(128, 0, 128, 1)">3</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> number</span>
console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> (<span style="color: rgba(128, 0, 0, 1)">''</span>+<span style="color: rgba(128, 0, 128, 1)">3</span>));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">string</span></pre>
</div>
<p>对于运算结果不能转换成数字的,将返回 NaN</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> * <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sd</span><span style="color: rgba(128, 0, 0, 1)">'</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">NaN</span>
console.log(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">B</span><span style="color: rgba(128, 0, 0, 1)">'</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> NaN</span></pre>
</div>
<p>这张图是运算转换的规则</p>
<p><img src="https://raw.githubusercontent.com/dushao103500/You-must-know/master/images/15_3.png"></p>
<p>3、运算符转换</p>
<h3 id="如果-list-很大下面的这段递归代码会造成堆栈溢出如果在不改变递归模式的前提下修善这段代码">16、如果 list 很大,下面的这段递归代码会造成堆栈溢出。如果在不改变递归模式的前提下修善这段代码?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> list =<span style="color: rgba(0, 0, 0, 1)"> readHugeList();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> nextListItem =<span style="color: rgba(0, 0, 0, 1)"> function() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> item =<span style="color: rgba(0, 0, 0, 1)"> list.pop();
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (item) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> process the list item...</span>
<span style="color: rgba(0, 0, 0, 1)"> nextListItem();
}
};</span></pre>
</div>
<p>原文上的解决方式是加个定时器:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> list =<span style="color: rgba(0, 0, 0, 1)"> readHugeList();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> nextListItem =<span style="color: rgba(0, 0, 0, 1)"> function() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> item =<span style="color: rgba(0, 0, 0, 1)"> list.pop();
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (item) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> process the list item...</span>
setTimeout( nextListItem, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
}
};</span></pre>
</div>
<p>解决方式的原理请参考第10题。</p>
<h3 id="什么是闭包举例说明">17、什么是闭包?举例说明</h3>
<p>可以参考此篇:从作用域链谈闭包</p>
<h3 id="下面的代码会输出什么为啥">18、下面的代码会输出什么?为啥?</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < <span style="color: rgba(128, 0, 128, 1)">5</span>; i++<span style="color: rgba(0, 0, 0, 1)">) {
setTimeout(function() { console.log(i); }, i </span>* <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)"> );
}</span></pre>
</div>
<p>请往前面翻,参考第4题,解决方式已经在上面了</p>
<h3 id="解释下列代码的输出">19、解释下列代码的输出</h3>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0 || 1 = </span><span style="color: rgba(128, 0, 0, 1)">"</span>+(<span style="color: rgba(128, 0, 128, 1)">0</span> || <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1 || 2 = </span><span style="color: rgba(128, 0, 0, 1)">"</span>+(<span style="color: rgba(128, 0, 128, 1)">1</span> || <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0 && 1 = </span><span style="color: rgba(128, 0, 0, 1)">"</span>+(<span style="color: rgba(128, 0, 128, 1)">0</span> && <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1 && 2 = </span><span style="color: rgba(128, 0, 0, 1)">"</span>+(<span style="color: rgba(128, 0, 128, 1)">1</span> && <span style="color: rgba(128, 0, 128, 1)">2</span>));</pre>
</div>
<p>逻辑与和逻辑或运算符会返回一个值,并且二者都是短路运算符:</p>
<p>逻辑与返回第一个是 false 的操作数 或者 最后一个是 true的操作数</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 128, 1)">1</span> && <span style="color: rgba(128, 0, 128, 1)">2</span> && <span style="color: rgba(128, 0, 128, 1)">0</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">1</span> && <span style="color: rgba(128, 0, 128, 1)">0</span> && <span style="color: rgba(128, 0, 128, 1)">1</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">1</span> && <span style="color: rgba(128, 0, 128, 1)">2</span> && <span style="color: rgba(128, 0, 128, 1)">3</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3</span></pre>
</div>
<p>如果某个操作数为 false,则该操作数之后的操作数都不会被计算</p>
<p>逻辑或返回第一个是 true 的操作数 或者 最后一个是 false的操作数</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 128, 1)">1</span> || <span style="color: rgba(128, 0, 128, 1)">2</span> || <span style="color: rgba(128, 0, 128, 1)">0</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">0</span> || <span style="color: rgba(128, 0, 128, 1)">2</span> || <span style="color: rgba(128, 0, 128, 1)">1</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">0</span> || <span style="color: rgba(128, 0, 128, 1)">0</span> || <span style="color: rgba(0, 0, 255, 1)">false</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span></pre>
</div>
<p>如果某个操作数为 true,则该操作数之后的操作数都不会被计算</p>
<p>如果逻辑与和逻辑或作混合运算,则逻辑与的优先级高:</p>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(128, 0, 128, 1)">1</span> && <span style="color: rgba(128, 0, 128, 1)">2</span> || <span style="color: rgba(128, 0, 128, 1)">0</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">0</span> || <span style="color: rgba(128, 0, 128, 1)">2</span> && <span style="color: rgba(128, 0, 128, 1)">1</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span>
console.log(<span style="color: rgba(128, 0, 128, 1)">0</span> && <span style="color: rgba(128, 0, 128, 1)">2</span> || <span style="color: rgba(128, 0, 128, 1)">1</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span></pre>
</div>
<p>在 JavaScript,常见的 false 值:</p>
<p>要注意空数组([])和空对象({}):</p>
<div class="cnblogs_code">
<pre>console.log([] == <span style="color: rgba(0, 0, 255, 1)">false</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log({} == <span style="color: rgba(0, 0, 255, 1)">false</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
console.log(Boolean([])) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span>
console.log(Boolean({})) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true</span></pre>
</div>
<p>所以在 if 中,[] 和 {} 都表现为 true:</p>
<h3 id="解释下面代码的输出">20、解释下面代码的输出</h3>
<div class="cnblogs_code">
<pre>console.log(<span style="color: rgba(0, 0, 255, 1)">false</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
console.log(</span><span style="color: rgba(0, 0, 255, 1)">false</span> === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>请参考前面第14题运算符转换规则的图。</p>
<h3 id="解释下面代码的输出-1">21、解释下面代码的输出</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> a=<span style="color: rgba(0, 0, 0, 1)">{},
b</span>={key:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">},
c</span>={key:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">};
a</span>=<span style="color: rgba(128, 0, 128, 1)">123</span><span style="color: rgba(0, 0, 0, 1)">;
a</span>=<span style="color: rgba(128, 0, 128, 1)">456</span><span style="color: rgba(0, 0, 0, 1)">;
console.log(a);</span></pre>
</div>
<p>输出是 456,参考原文的解释:</p>
<blockquote>
<p>原因如下:设置对象属性时,javascript将隐式地将参数值字符串化。在这种情况下,因为B和C都是对象,所以它们都将被转换为“[对象对象]”。因此,a和a都相当于一个[“[对象对象]”],可以互换使用。因此,设置或引用A与设置或引用A完全相同。</p>
</blockquote>
<h3 id="解释下面代码的输出-2">22、解释下面代码的输出</h3>
<div class="cnblogs_code">
<pre>console.log((function f(n){<span style="color: rgba(0, 0, 255, 1)">return</span> ((n > <span style="color: rgba(128, 0, 128, 1)">1</span>) ? n * f(n-<span style="color: rgba(128, 0, 128, 1)">1</span>) : n)})(<span style="color: rgba(128, 0, 128, 1)">10</span>));</pre>
</div>
<p>结果是10的阶乘。这是一个递归调用,为了简化,我初始化 n=5,则调用链和返回链如下:</p>
<p>递归</p>
<h3 id="解释下面代码的输出-3">23、解释下面代码的输出</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(function(x) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (function(y) {
console.log(x);
})(</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">)
})(</span><span style="color: rgba(128, 0, 128, 1)">1</span>);</pre>
</div>
<p>输出1,闭包能够访问外部作用域的变量或参数。</p>
<h3 id="解释下面代码的输出并修复存在的问题">24、解释下面代码的输出,并修复存在的问题</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> hero =<span style="color: rgba(0, 0, 0, 1)"> {
_name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">John Doe</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
getSecretIdentity: function (){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._name;
}
};
</span><span style="color: rgba(0, 0, 255, 1)">var</span> stoleSecretIdentity =<span style="color: rgba(0, 0, 0, 1)"> hero.getSecretIdentity;
console.log(stoleSecretIdentity());
console.log(hero.getSecretIdentity());</span></pre>
</div>
<p>将 getSecretIdentity 赋给 stoleSecretIdentity,等价于定义了 stoleSecretIdentity 函数:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> stoleSecretIdentity =<span style="color: rgba(0, 0, 0, 1)">function (){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._name;
}</span></pre>
</div>
<p>stoleSecretIdentity 的上下文是全局环境,所以第一个输出 undefined。若要输出 John Doe,则要通过 call 、apply 和 bind 等方式改变 stoleSecretIdentity 的this 指向(hero)。</p>
<p>第二个是调用对象的方法,输出 John Doe。</p>
<h3 id="给你一个-dom-元素创建一个能访问该元素所有子元素的函数并且要将每个子元素传递给指定的回调函数">25、给你一个 DOM 元素,创建一个能访问该元素所有子元素的函数,并且要将每个子元素传递给指定的回调函数。</h3>
<p>函数接受两个参数:</p>
<p>DOM<br>指定的回调函数<br>原文利用 深度优先搜索(Depth-First-Search) 给了一个实现:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">function Traverse(p_element,p_callback) {
p_callback(p_element);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> list =<span style="color: rgba(0, 0, 0, 1)"> p_element.children;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < list.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
Traverse(list,p_callback);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> recursive call</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}
原文转自:https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.cnblogs.com/yzhihao/p/6530564.html</span></pre>
</div>
<p>26、输出结果是多少?</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> a;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> b = a * <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (b ==<span style="color: rgba(0, 0, 0, 1)"> b) {
console.log(b </span>* <span style="color: rgba(128, 0, 128, 1)">2</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span> - <span style="color: rgba(128, 0, 128, 1)">0</span> + <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b=NaN</span>
<span style="color: rgba(0, 0, 0, 1)">
console.log(</span>!b * <span style="color: rgba(128, 0, 128, 1)">2</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span> - <span style="color: rgba(128, 0, 128, 1)">0</span> + <span style="color: rgba(128, 0, 128, 1)">4</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1*2+”2”-0+4</span>
<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>答案:26</p>
<p>考点:乘号运算符的运算规则:</p>
<p>1、 如果其中一个数是NaN,则结果就是NaN</p>
<p>2、如果乘积超过了ECMAScript设定的范围,那么就会返回Infinity、-Infinity</p>
<p>3、如果参与乘法运算的某个操作数不是数值,js引擎会先调用Number()将这个数变成一个数值类型,</p>
<p>比如:空字符串就会变成0 布尔值true就会变成1,空数组[]也会变成0,undefined转换结果则是变成了NaN</p>
<p>27、下面代码会有什么样的输出</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> User = { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对象</span>
<span style="color: rgba(0, 0, 0, 1)">
count </span>= <span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">属性</span>
<span style="color: rgba(0, 0, 0, 1)">
getCount:function(){ </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">方法</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.count;
}
}
console.log(User.getCount());
</span><span style="color: rgba(0, 0, 255, 1)">var</span> func =<span style="color: rgba(0, 0, 0, 1)"> User.getCount;
console.log(func());</span></pre>
</div>
<p>答案:1 undefined</p>
<p>28、下面代码会有什么样的输出</p>
<div class="cnblogs_code">
<pre><script>
<span style="color: rgba(0, 0, 255, 1)">var</span> a = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span></script>
<script>
<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> a;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> b = a * <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (b == b) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b=0</span>
<span style="color: rgba(0, 0, 0, 1)">
console.log(b </span>* <span style="color: rgba(128, 0, 128, 1)">2</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span> - <span style="color: rgba(128, 0, 128, 1)">0</span> + <span style="color: rgba(128, 0, 128, 1)">4</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0*2+”2”-0+4</span>
<span style="color: rgba(0, 0, 0, 1)">
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>!b * <span style="color: rgba(128, 0, 128, 1)">2</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span> - <span style="color: rgba(128, 0, 128, 1)">0</span> + <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span></script></pre>
</div>
<p>答案:6</p>
<p>29、下列JavaScript代码执行后,运行的结果是</p>
<div class="cnblogs_code">
<pre><button id=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">btn</span><span style="color: rgba(128, 0, 0, 1)">'</span>>点击我</button>
<span style="color: rgba(0, 0, 255, 1)">var</span> btn = document.getElementById(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">btn</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> handler =<span style="color: rgba(0, 0, 0, 1)"> {
id: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_eventHandler</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
exec: function(){
alert(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.id);
}
}
btn.addEventListener(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">click</span><span style="color: rgba(128, 0, 0, 1)">'</span>, handler.exec);</pre>
</div>
<p>答案:btn,因为handler.exec是由btn这个按钮执行的</p>
<p>30、下面代码执行结果</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> obj = {proto: {a:<span style="color: rgba(128, 0, 128, 1)">1</span>,b:<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">}};
function F(){};
F.prototype </span>=<span style="color: rgba(0, 0, 0, 1)"> obj.proto;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> f = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> F();
obj.proto.c </span>= <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
obj.proto </span>= {a:-<span style="color: rgba(128, 0, 128, 1)">1</span>, b:-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">};
alert(f.a);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span>
<span style="color: rgba(0, 0, 0, 1)">
alert(f.c);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3</span>
<span style="color: rgba(0, 0, 0, 1)">
delete F.prototype[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">];
alert(f.a);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">undefined</span>
<span style="color: rgba(0, 0, 0, 1)">
alert(obj.proto.a);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">-1</span></pre>
</div>
<p>31、</p>
<p>console.log(null==undefined); //答案:true</p>
<p>console.log("1"==1); //答案:true,因为会将数字1先转换为字符串1</p>
<p>console.log("1"===1); //答案:false,因为数据类型不一致</p>
<p>32、</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> foo = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
function bar() {
foo </span>= <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
function foo() {}
}
bar();
alert(foo);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">答案:1</span></pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/wmrp/p/11071855.html
頁:
[1]