原文地址:[link](http://qiita.com/suetake/items/425684ac278c7cf8c30c?utm_source=Qiitaニュース&utm_campaign=f86abd28a8-Qiita_newsletter_231_10_26_2016&utm_medium=email&utm_term=0_e44feaa081-f86abd28a8-33264389) ### まえがき | 前言 jsは今や世界中の人々に愛されいています。 | js被全世界爱着。 ![](https://i.gyazo.com/259d9cb3a67cfa3ab749710881e54ea4.png) 真的非常喜欢这样讲编程细节的文章,闲暇之余充实自己,毕竟,在网上粘的那些代码,看再多遍也终究不是自己的东西。 ### 入門編(闇レベル:★☆☆)| 入门篇(暗黑度:★☆☆) #### indexOf及び~演算子 | indexof和运算符 ```javascript var foods = ['apple', 'banana', 'orange']; if (~foods.indexOf('apple')) { // appleが含まれていた時の処理 } ``` まずは入門編、第一章第一節。 結構よく見かける表現なのではないかと思います。使ったことのある方も多いのではないでしょうか。 リーダブルコード的にはあれだけど、書きやすいし知ってる人同士の間ではとってもリーダブル?な一品。 これは何をしているのかと言うと、foodsという配列の中にappleという要素が含まれているか否かを判定しています。 ポイントは-1をビット反転させた場合です。-1の時だけ0になっているのがわかると思います。 JavaScriptでは0はfalse、それ以外はtrueなので結果的にこのロジックで判定が可能というわけです。 一般的写法是foods.indexOf('apple') !== -1 这里用到的是关于[~]波浪运算符的trick,因为~是NOT bit运算符,indexOf找不到字符时返回-1, NOT(11111....1111)=>(0000...00000),所以~-1 = 0,而在js中0是解释为false,其余都是true,因此这个逻辑就走的通了。 NaN値が配列内に含まれているかの確認を行いたい場合はArray.prototype.includes()を用いると意図した挙動となります。 | 然后希望确认NaN的时候,需要用includes: ```javascript [NaN].indexOf(NaN); // -1 [NaN].includes(NaN); // true ``` #### Function Declarations vs Function Expressions js面试题必考题,一直懵懵懂懂。 次のコードの内シンタックスエラーになる書き方があります。 ```javascript // pt1 void function() { return 'ok'; }(); // pt2 function() { return 'ok'; }(); // pt3 [function() { return 'ok'; }()] // pt4 var hoge = function() { return 'ok'; }(); ``` pt2はその他のパターンと一見似て見えますが、決定的に違う点が一つだけあります。 それはFunction Declarations(関数宣言)であるか、Function Expressions(関数式)であるかです。 错的是pt2,因为会在"}"后面强制插入; ```javascript // pt2 function() {return 'ok';};(); // ← SyntaxError ``` このようなコードは即時実行関数と呼ばれ、グローバルスコープ汚染対策として一般的に利用されています。 初めて即時実行関数を見た際、なぜ最初のfunction(){}は括弧で囲う必要があるのか?と思ったものですが、 下記コードの前者がNGで後者がOKな理由は、式であるか、宣言であるか、の違いによるものだということがわかります。 (function(){})(),就转变为了函数表达式,不会报错了。平时自己几乎都在用函数申明吧,这个还有个很重要的概念,**函数声明提前** ```javascript sayTruth(); if(1){ function sayTruth(){alert('myvin is handsome')}; } else{ function sayTruth(){alert('myvin is ugly')}; } ``` 答案输出,”myvin is ugly“。[详细讲解点我](http://www.cnblogs.com/myvin/p/4649789.html) ### 中級編(闇レベル:★★☆) | 终极篇(暗黑度:★★☆) #### Array.prototype.slice.call()