-
부울 유형으로 변환
JavaScript의 모든 값은 다음과 같이 암시적으로 부울 유형으로 변환될 수 있습니다. 0 == false; // true<br>
1 == true; // true<br>
'' == false // true<br>
null == false // true<br>
그러나 이러한 값은 부울 유형이 아닙니다.
따라서 비교를 위해 세 개의 등호를 사용하는 경우: 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>
정의되지 않음
- 으로 대체되었습니다. 이 예에서 plus(2)
와 plus(2, undefine)은 동일하며 function plus(base, added) {<br>
return base + added;<br>
}<br>
plus(2); // NaN<br>
2 undefine의 결과는 NaN입니다. . 이제 문제는 두 번째 매개변수가 전달되지 않은 경우 초기 값을 어떻게 할당할 것인가입니다. 일부 네티즌들은 plus(2, 0) = 3이라고 언급했는데, 정말 그런 곳인 것 같습니다.
function plus(base, added) {<br>
added = added || 1;<br>
return base + added;<br>
}<br>
plus(2); // 3<br>
plus(2, 2); // 4<br>
다른 사람이 Iframe에서 귀하의 페이지를 로드하는 것을 방지하세요
function plus(base, added) {<br>
added = added || (added === 0 ? 0 : 1);<br>
return base + added;<br>
}<br>
귀하의 웹사이트가 인기를 얻으면 귀하의 웹사이트에 링크하거나 귀하의 웹페이지를 삽입하려는 웹사이트가 많이 있을 것입니다. IFrame을 통한 웹페이지.
재밌지도 않은데 어떻게 하면 이런 행동을 멈출 수 있을까요?
- 이 코드는 각 페이지의 머리에 배치되어야 합니다. 누군가가 실제 생활에서 이 코드를 사용하는지 알고 싶다면 Baidu의 블로그를 살펴보세요.
if(top !== window) {<br>
top.location.href = window.location.href;<br>
}<br>
문자열 대체
String.prototype.replace
- 이 함수는 C#이나 Java에 매우 익숙한 프로그래머를 종종 혼란스럽게 합니다. 예:
replace 함수의 첫 번째 매개변수는 정규식입니다. 첫 번째 매개변수로 문자열을 전달하면 일치하는 첫 번째 문자열만 교체됩니다.
이 문제를 해결하려면 정규식을 사용할 수 있습니다. 'Hello world, hello world'.replace('world', 'JavaScript');<br>
// The result is "Hello JavaScript, hello world"<br>
대체 시 대소문자를 무시하도록 지정할 수도 있습니다.
인수를 배열로 변환 '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
속성은 있지만 슬라이스, 푸시, 정렬 등의 기능은 없습니다. 따라서 인수를 만드는 방법은 이러한 경우에만 사용할 수 있는 기능이 있습니다. 배열?
즉, 인수를 실제 배열로 만드는 방법은 무엇일까요?
parseInt 함수의 두 번째 매개변수를 지정하세요 function args() {<br>
return [].slice.call(arguments, 0);<br>
}<br>
args(2, 5, 8); // [2, 5, 8]<br>
parseInt
- 는 문자열을 정수로 변환하는 데 사용됩니다. 구문은 다음과 같습니다. 두 번째 매개변수는 선택 사항입니다. , 첫 번째 매개변수의 10진수를 지정하는 데 사용됩니다. 두 번째 매개변수가 전달되지 않으면 다음 규칙을 따릅니다.
-> str이 0x로 시작하면 16진수로 간주됩니다. parseInt(str, [radix])<br>
->
str
이 0으로 시작하면 8진수로 간주됩니다. -> 그렇지 않으면 소수로 간주됩니다. 따라서 이러한 규칙을 모른다면 다음 코드는 혼란스러울 것입니다.
따라서 안전을 위해 parseInt
에 대한 두 번째 매개변수를 지정해야 합니다.
parseInt('08'); // 0<br>
parseInt('08', 10); // 8<br>
배열에서 요소 삭제
delete
- 를 통해 이를 수행할 수 있습니다. 보시다시피 delete
는 그렇지 않습니다. 정말 작동합니다. 배열에서 요소를 삭제합니다. 삭제된 요소는 undefine으로 대체되며 배열의 길이는 변경되지 않습니다. var arr = [1, 2, 3, 4, 5];<br>
delete arr[1];<br>
arr; // [1, undefined, 3, 4, 5]<br>
사실 아래와 같이 Array.prototype의 splice 함수를 통해 배열의 요소를 삭제할 수 있습니다.
함수도 객체입니다 var arr = [1, 2, 3, 4, 5];<br>
arr.splice(1, 1);<br>
arr; // [1, 3, 4, 5]<br>
자바스크립트에서는 함수에 속성을 추가할 수 있으므로 함수도 객체입니다.
예:
- 이 함수가 호출된 횟수를 기록하기 위해 add 함수에
count
속성을 추가했습니다. function add() {<br>
return add.count++;<br>
}<br>
add.count = 0;<br>
add(); // 0<br>
add(); // 1<br>
add(); // 2<br>
물론 이는 보다 우아한 방법으로 달성할 수 있습니다. 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>
IE용 Math.max(2, 3, 45, 12, 8); // 45<br>
console.log var arr = [2, 3, 45, 12, 8];<br>
Math.max.apply(null, arr); // 45<br>
기능 추가
- 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의 예약어인가요?
- 그렇게 보이지만 실제로 undefound는 JavaScript의 키워드가 아닙니다. 이 코드는 이상하다고 느낄 수도 있지만 정상적으로 작동합니다. undefine 단지 사전 정의된 것입니다. 자바스크립트의 변수. 참고: 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 是一种区分大小写的程序语言.