-
ブール型に変換
JavaScript のすべての値は、次のように暗黙的にブール型に変換できます。 0 == false; // true<BR>
1 == true; // true<BR>
'' == false // true<BR>
null == false // true<BR>
ログイン後にコピー
ただし、これらの値はブール型ではありません。
そこで、比較に 3 つの等号を使用すると: 0 === false; // false<BR>
1 === true; // false<BR>
'' === false // false<BR>
null === false // false<BR>
ログイン後にコピー
ここで問題となるのは、他の型をブール型に変換する方法です: !!0 === false; // true<BR>
!!1 === true; // true<BR>
!!'' === false // true<BR>
!!null === false // true<BR>
ログイン後にコピー
- パラメータに初期値を割り当てる
JavaScript にはオーバーロードの概念はありませんが、JavaScript の関数のパラメータは、呼び出し時に 1 つのパラメータが欠落している場合、< になります。 🎜>未定義に置き換えられました。 この例では、 function plus(base, added) {<BR>
return base + added;<BR>
}<BR>
plus(2); // NaN<BR>
ログイン後にコピー
plus(2) と plus(2, unknown) は同等であり、2 unknown の結果は NaN になります。 。 ここでの問題は、2 番目のパラメータが渡されない場合、それに初期値を割り当てる方法です。
function plus(base, added) {<BR>
added = added || 1;<BR>
return base + added;<BR>
}<BR>
plus(2); // 3<BR>
plus(2, 2); // 4<BR>
ログイン後にコピー
一部のネチズンは plus(2, 0) = 3; と述べていますが、これは実際に当てはまり、この場所には特別な対応が必要のようです:
function plus(base, added) {<BR>
added = added || (added === 0 ? 0 : 1);<BR>
return base + added;<BR>
}<BR>
ログイン後にコピー
- 他の人があなたのページを Iframe にロードできないようにします あなたの Web サイトが非常に人気になると、多くの Web サイトがあなたの Web サイトにリンクしたり、独自の Web ページを埋め込んだりすることになります。 IFrame 経由の Web ページ。
これは面白くないので、この行動を止めるにはどうすればよいでしょうか?
このコードは各ページの if(top !== window) {<BR>
top.location.href = window.location.href;<BR>
}<BR>
ログイン後にコピー
ヘッド に配置する必要があります。実際に誰かがこのコードを使用しているかどうか知りたい場合は、Baidu のブログを参照してください。
- String Replacement
String.prototype.replace この関数は、C# や Java に精通しているプログラマをしばしば混乱させます。 例:
'Hello world, hello world'.replace('world', 'JavaScript');<BR>
// The result is "Hello JavaScript, hello world"<BR>
ログイン後にコピー
replace 関数の最初のパラメーターは正規表現です。 最初のパラメータとして文字列を渡すと、最初に見つかった一致する文字列のみが置換されます。
この問題を解決するには、正規表現を使用できます:
置換時に大文字と小文字を区別するように指定することもできます: 'Hello world, hello world'.replace(/world/g, 'JavaScript');<BR>
// The result is "Hello JavaScript, hello JavaScript"<BR>
ログイン後にコピー
'Hello world, hello world'.replace(/hello/gi, 'Hi');<BR>
// The result is "Hi world, Hi world"<BR>
ログイン後にコピー
- 引数を配列に変換します 関数
arguments の事前定義変数は実際の配列ではなく、配列のようなオブジェクトです。
length 属性はありますが、スライス、プッシュ、ソートなどの関数はありません。そこで、引数 にこれらにのみ使用できる関数を持たせる方法配列? 言い換えれば、
引数を実数配列にするにはどうすればよいでしょうか? function args() {<BR>
return [].slice.call(arguments, 0);<BR>
}<BR>
args(2, 5, 8); // [2, 5, 8]<BR>
ログイン後にコピー
- parseInt 関数の 2 番目のパラメータを指定します
parseInt は、文字列を整数値に変換するために使用されます。 2 番目のパラメータはオプションです。 、最初のパラメータの 10 進数を指定するために使用されます。 parseInt(str, [radix])<BR>
ログイン後にコピー
2 番目のパラメータが渡されない場合は、次の規則に従います:
->
str が 0x で始まる場合、16 進数とみなされます。 ->
str が 0 で始まる場合、8 進数とみなされます。 -> それ以外の場合は、10 進数とみなされます。
したがって、これらのルールを知らないと、次のコードは混乱するでしょう:
parseInt('08'); // 0<BR>
parseInt('08', 10); // 8<BR>
ログイン後にコピー
したがって、安全側として、
parseInt の 2 番目のパラメーターを必ず指定してください。
- 配列から要素を削除します おそらく、
delete を使用してそれを行うことができます。 ご覧のとおり、 var arr = [1, 2, 3, 4, 5];<BR>
delete arr[1];<BR>
arr; // [1, undefined, 3, 4, 5]<BR>
ログイン後にコピー
delete では実行できません。本当に動作します 配列から要素を削除します。削除された要素は unknown に置き換えられ、配列の長さは変わりません。
実際、以下に示すように、Array.prototype の
splice 関数を通じて配列内の要素を削除できます。
var arr = [1, 2, 3, 4, 5];<BR>
arr.splice(1, 1);<BR>
arr; // [1, 3, 4, 5]<BR>
ログイン後にコピー
関数もオブジェクトです
- JavaScript では、関数にプロパティを追加できるため、関数もオブジェクトです。 例: この関数が呼び出された回数を記録するために、関数
add
に function add() {<BR>
return add.count++;<BR>
}<BR>
add.count = 0;<BR>
add(); // 0<BR>
add(); // 1<BR>
add(); // 2<BR>
ログイン後にコピー
count 属性を追加しました。 もちろん、これはより洗練された方法で実現できます。
arguments.callee
は、現在実行中の関数を指します。 function add() {<BR>
if(!arguments.callee.count) {<BR>
arguments.callee.count = 0;<BR>
}<BR>
return arguments.callee.count++;<BR>
}<BR>
add(); // 0<BR>
add(); // 1<BR>
add(); // 2<BR>
ログイン後にコピー
配列の最大値
- 数値でいっぱいの配列の最大値を見つける方法は、ループを通じて簡単に実行できます。 他に方法はありますか? JavaScript には数値を処理するための Math
オブジェクトがあることは誰もが知っています: var arr = [2, 3, 45, 12, 8];<BR>
var max = arr[0];<BR>
for(var i in arr) {<BR>
if(arr[i] > max) {<BR>
max = arr[i];<BR>
}<BR>
}<BR>
max; // 45<BR>
ログイン後にコピー
そして、次のように配列内の最大値を見つけることができます:
Math.max(2, 3, 45, 12, 8); // 45<BR>
ログイン後にコピー
var arr = [2, 3, 45, 12, 8];<BR>
Math.max.apply(null, arr); // 45<BR>
ログイン後にコピー
IE に
console.log - 機能を追加 Firefox での Firebug のサポートにより、ステーションの記録を制御するために console.log をよく使用します。いくつかの情報。
ただし、現時点では console オブジェクトがまったくないため、このアプローチでは IE で JavaScript を実行できなくなります (Firefox で Firebug が有効になっていない場合も同様です)。
次のヒントを使用して、この問題の発生を防ぐことができます:
if (typeof(console) === 'undefined') {<BR>
window.console = {<BR>
log: function(msg) {<BR>
alert(msg);<BR>
}<BR>
};<BR>
}<BR>
console.log('debug info.');<BR>
ログイン後にコピー
未定義 - は JavaScript の予約キーワードですか? そのように見えますが、実際には、未定義は JavaScript のキーワードではありません: このコードは奇妙に感じるかもしれませんが、正常に動作します。未定義
これは単なる事前定義されたものです。 JavaScript の変数。 var undefined = 'Hello'; <BR>
undefined; // 'Hello'<BR>
ログイン後にコピー
注: JavaScript プログラムではこれを決して行わないでください。このトリックは、これが事実であることを示すだけです。
- 判断一个变量是否为undefined
两种情况下,一个变量为undefined:
1. 声明了变量,但是没有赋值 var name; <BR>
name === undefined; // true<BR>
ログイン後にコピー
2. 从来没有声明过此变量 name2 === undefined; // error – name2 is not defined<BR>
ログイン後にコピー
在第二种情况下,会有一个错误被抛出,那么如果判断一个变量是否为undefined而不产生错误呢?
下面提供了一种通用的方法: typeof(name2) === ‘undefined'; // true<BR>
ログイン後にコピー
- 预加载图片
预加载图片就是加载页面上不存在的图片,以便以后使用JavaScript把它们快速显示出来。
比如你想在鼠标移动到某个图片上时显示另一张图片: var img = new Image(); <BR>
img.src = "clock2.gif";<BR>
ログイン後にコピー
<img src="clock.gif" src="clock.gif" alt="" <BR>
onmouseover="this.src='clock2.gif';" <BR>
onmouseout="this.src=clock.gif';" /><BR>
ログイン後にコピー
那么,如何加载一组图片呢?考虑如下代码: var source = ['img1.gif','img2.gif']; <BR>
var img = new Image(); <BR>
for(var i = 0; i < source.length; i++) { <BR>
img.src = source[i]; <BR>
}<BR>
ログイン後にコピー
实际上,这段代码只能预加载最后的一张图片,因为其他的图片根本没有时间来预加载在循环到来的时候。
因此正确的写法应该是: var source = ['img1.gif','img2.gif']; <BR>
for(var i = 0; i < source.length; i++) { <BR>
var img = new Image(); <BR>
img.src = source[i]; <BR>
}<BR>
ログイン後にコピー
- 闭包(closure)
闭包指的是函数内的局部变量,当函数返回时此变量依然可用。
当你在函数内部定义另外一个函数时,你就创建了一个闭包,一个著名的例子:
function add(i) { <BR>
return function() { <BR>
return ++i; <BR>
}; <BR>
} <BR>
add(2).toString(); // "function () { return ++i; }" <BR>
add(2)(); // 3<BR>
ログイン後にコピー
add(2) 是一个函数,它可能获取外部函数的局部变量i 。
参考文章
- 私有变量
我们经常使用命名规范来标示一个变量是否为私有变量(最常用来标示): var person = { <BR>
_name: '', <BR>
getName: function() { <BR>
return this._name || 'not defined'; <BR>
} <BR>
}; <BR>
person.getName(); // "not defined"<BR>
ログイン後にコピー
下划线前缀用来作为私有变量的约定,但是其他开发人员仍然可以调用此私有变量: person._name; // ""<BR>
ログイン後にコピー
那么,如何在JavaScript中创建一个真正的私有变量呢?
主要技巧是使用匿名函数(anonymous function)和闭包(closure)。 var person = {}; <BR>
(function() { <BR>
var _name = ''; <BR>
person.getName = function() { <BR>
return _name || 'not defined'; <BR>
} <BR>
})(); <br><br>
person.getName(); // "not defined" <BR>
typeof(person._name); // "undefined"<BR>
ログイン後にコピー
- JavaScript没有块级上下文(Scope)
JavaScript中块级代码没有上下文,实际上只有函数有自己的上下文。 for(var i = 0; i < 2; i ++) { <br><br>
} <BR>
i; // 2<BR>
ログイン後にコピー
如果想创建一个上下文,可以使用自执行的匿名函数: (function (){ <BR>
for(var i = 0; i < 2; i ++) { <br><br>
}<BR>
})(); <BR>
typeof(i) === 'undefined'; // true<BR>
ログイン後にコピー
- 怪异的NaN
NaN用来表示一个值不是数字。
NaN在JavaScript中行为很怪异,是因为那NaN和任何值都不相等(包括它自己)。 NaN === NaN; // false<BR>
ログイン後にコピー
因为下面的代码可能会让一些人抓狂: parseInt('hello', 10); // NaN <BR>
parseInt('hello', 10) == NaN; // false <BR>
parseInt('hello', 10) === NaN; // false<BR>
ログイン後にコピー
那么如何来检查一个值是否NaN?
可以使用window.isNaN来判断: isNaN(parseInt('hello', 10)); // true<BR>
ログイン後にコピー
- 真值和假值
JavaScript中所有值都能隐式地转化为Boolean类型。
在条件判断中,下面这些值会自动转化为false:
null, undefined, NaN, 0, ‘', false
因此,不需要做如下复杂的判断: if(obj === undefined || obj === null) { <BR>
}<BR>
ログイン後にコピー
而只需要这样做就行了: if(!obj) { <br><br>
}<BR>
ログイン後にコピー
- 修改arguments
比如,添加一个值到arguments中: function add() { <BR>
arguments.push('new value'); <BR>
} <BR>
add(); // error - arguments.push is not a function<BR>
ログイン後にコピー
这样会出错,因为arguments 不是一个真正的数组,没有push方法。
解决办法: function add() { <BR>
Array.prototype.push.call(arguments, 'new value'); <BR>
return arguments; <BR>
} <BR>
add()[0]; // "new value"<BR>
ログイン後にコピー
- Boolean 和 new Boolean
我们可以把Boolean看做是一个函数,用来产生Boolean类型的值(Literal): Boolean(false) === false; // true <BR>
Boolean('') === false; // true<BR>
ログイン後にコピー
所以,Boolean(0) 和!!0 是等价的。
我们也可以把Boolean看做是一个构造函数,通过new 来创建一个Boolean类型的对象: new Boolean(false) === false; // false <BR>
new Boolean(false) == false; // true <BR>
typeof(new Boolean(false)); // "object" <BR>
typeof(Boolean(false)); // "boolean"<BR>
ログイン後にコピー
- 快速字符串连接
我们经常使用+ 将较短的字符串连接为一个长字符串,这在大部分的情况下是没问题的。
但是如果有大量的字符串需要连接,这种做法将会遇到性能问题,尤其是在IE下。
var startTime = new Date();<BR>
var str = '';<BR>
for (var i = 0; i < 50000; i++) {<BR>
str += i;<BR>
}<BR>
alert(new Date() - startTime); // Firefox - 18ms, IE7 - 2060ms<BR>
ログイン後にコピー
var startTime = new Date();<BR>
var arr = [];<BR>
for (var i = 0; i < 100000; i++) {<BR>
arr.push(i);<BR>
}<BR>
var str = arr.join("");<BR>
alert(new Date() - startTime); // Firefox - 38ms, IE7 - 280ms<BR>
ログイン後にコピー
可以看到Firefox似乎对+ 操作符进行了优化,而IE则表现的傻乎乎的。
- 一元操作符 +
在JavaScript中,我们可以在字符串之前使用一元操作符“+”。这将会把字符串转化为数字,如果转化失败则返回NaN。
2 + '1'; // "21"<BR>
2 + ( +'1'); // 3<BR>
ログイン後にコピー
如果把 + 用在非字符串的前面,将按照如下顺序进行尝试转化:
- 调用valueOf()
- 调用toString()
- 转化为数字
+new Date; // 1242616452016<BR>
+new Date === new Date().getTime(); // true<BR>
+new Date() === Number(new Date) // true<BR>
ログイン後にコピー
参考文章
- encodeURI和encodeURIComponent
window.encodeURI函数用来编码一个URL,但是不会对以下字符进行编码:“:”, “/”, “;”, “?”.
window.encodeURIComponent则会对上述字符进行编码。
我们通过一个例子来说明: 'index.jsp?page='+encodeURI('/page/home.jsp'); // "index.jsp?page=/page/home.jsp"<BR>
'index.jsp?page='+encodeURIComponent('/page/home.jsp'); // "index.jsp?page=%2Fpage%2Fhome.jsp"<BR>
ログイン後にコピー
因此,在对URL进行编码时我们经常会选择 encodeURIComponent。
- table.innerHTML在IE下是只读属性
我们经常通过节点的innerHTML 属性来填充节点,比如: <div id="container1"> </div><BR>
ログイン後にコピー
document.getElementById('container1').innerHTML = "Hello World!";
ログイン後にコピー
但是在IE下设置table.innerHTML 将会导致错误: <table id="table1"> </table><BR>
ログイン後にコピー
// works well in Firefox, but fail to work in IE<BR>
document.getElementById('table1').innerHTML = "<tr><td>Hello</td><td>World!</td></tr>";<BR>
ログイン後にコピー
实际上,table, thead, tr, select等元素的innerHTML属性在IE下都是只读的。
那么如果动态的创建一个table呢,下面提供了一种可行的方法: <div id="table1"> </div><BR>
ログイン後にコピー
document.getElementById('table1').innerHTML = "<table><tr><td>Hello</td><td>World!</td></tr></table>";<BR>
ログイン後にコピー
- 0.1+0.2 != 0.3
JavaScript将小数作为浮点数对待,所以可能会产生一些四舍五入的错误,比如: 0.1 + 0.2; // 0.30000000000000004
ログイン後にコピー
你可以通过toFixed方法指定四舍五入的小数位数: (0.1 + 0.2).toFixed(); // "0"<BR>
(0.1 + 0.2).toFixed(1); // "0.3"
ログイン後にコピー
javascript 是一种区分大小写的程序语言.
定义数组:
var strweek= new Array(7);
问号表达式
var i= (condition)?A:B;
相当于if-else 语句;condition 成立 执行A ,不成立执行B;
switch 语句
var i=3;
var result="";
swithck(i);
{
case 1;
result="First";
case 2;
result="Second";
case 3;
result="Three";
break;
}
Date类
getDate() getYear() getMont()
getMinutes() getHours() getSeconds()
setTimeout("fution()",1000);