你不知道的javascript上
1.尽可能避免在块内声明函数
foo(); // "b"
var a = true;
if (a) {
function foo() { console.log("a"); } }
else {
function foo() { console.log("b"); } }
2.函数提升优于变量提升,且相同的变量提升会被覆盖
foo(); // 1
var foo;
function foo() { console.log( 1 ); }foo = function() { console.log( 2 ); };
3.常见报错
foo(); // TypeError
bar(); // ReferenceError foo() 由于对 undefined 值进行函数调用而导致非法操作, 因此抛出 TypeError 异常。
var foo = function bar() { // ... };
[ReferenceError和TypeError](https://blog.csdn.net/zoey20140527/article/details/106750226?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control)
4.this
(1)变量的取值是函数定义的时候决定的,不是函数调用的时候决定的
(2)对象属性引用链中只有最顶层或者说最后一层会影响调用位置。举例来说
function foo() {
console.log( this.a );
}
var obj2 = { a: 42, foo: foo };
var obj1 = { a: 2, obj2: obj2 };
obj1.obj2.foo(); // 42
5.数组也是对象,可以拥有对方法的引用,通过.字符调用
6.GET
如果无论如何都没有找到名称相同的属性,那 [[Get]] 操作会返回值 undefined:
var myObject = { a:2 };
myObject.b;
// undefined 注意,这种方法和访问变量时是不一样的。如果你引用了一个当前词法作用域中不存在的 变量,并不会像对象属性一样返回 undefined,而是会抛出一个 ReferenceError 异常:
var myObject = {
a: undefined
};
myObject.a; // undefined
myObject.b; // undefined
6.for for of for in
for遍历数组的时候遍历的是下标index
for in用于对象的可枚举属性遍历(尽量不用于数组)
for of 直接遍历数组的值,是ES6新特性,也可用于对象
函数也有length属性,length的长度是参数个数
7.String内置方法
- indexOf()
- charAt()
- substr()、substring()、slice()
- toUpperCase()、toLowerCase()
- trim()
8.深拷贝时:
JSON.stringify(..) 在对象中遇到 undefined、function 和 symbol 时会自动将其忽略,在
数组中则会返回 null(以保证单元位置不变)
9.类型转换
ToString()、ToNumber()、toBoolean
10.解析和转换
解析只要前面可以解析,后面不影响解析结果就行,转换只要解析不对就不行
parseInt()只能解析字符串类型的数据
11.false
var a = "0";
var b = [];
var c = {};
var d = "";
var e = 0;
var f = null;
var g;
Boolean( a ); // true
Boolean( b ); // true
Boolean( c ); // true
Boolean( d ); // false
Boolean( e ); // false
Boolean( f ); // false
Boolean( g ); // false
1元运算符!会进行强制类型转换
var a = "0";
var b = [];
var c = {};
var d = "";
var e = 0;
var f = null;
var g;
!!a; // true
!!b; // true
!!c; // true
!!d; // false
!!e; // false
!!f; // false
!!g; // false
12.隐式类型转换
var a = [1,2];
var b = [3,4];
a + b; // "1,23,4"
13.JS中的||和&&
对于 || 来说,如果条件判断结果为 true 就返回第一个操作数(a 和 c)的值,如果为
false 就返回第二个操作数(b)的值。
&& 则相反,如果条件判断结果为 true 就返回第二个操作数(b)的值,如果为 false 就返
回第一个操作数(a 和 c)的值。
14.假值的相等比较
"0" == null; // false
"0" == undefined; // false
"0" == false; // true -- 晕!
"0" == NaN; // false
"0" == 0; // true
"0" == ""; // false
false == null; // false
false == undefined; // false
false == NaN; // false
false == 0; // true -- 晕!
false == ""; // true -- 晕!
false == []; // true -- 晕!
false == {}; // false
"" == null; // false
"" == undefined; // false
"" == NaN; // false
"" == 0; // true -- 晕!
"" == []; // true -- 晕!
"" == {}; // false
0 == null; // false
0 == undefined; // false
0 == NaN; // false
0 == []; // true -- 晕!
0 == {}; // false
15.运算符
var a = 42;
var b = (a++);//事实并非如此。( ) 本身并不是一个封装表达式,不会在表达式 a++ 产生副作用之后执行。
即便可以,a++ 会首先返回 42,除非有表达式在 ++ 之后再次对 a 进行运算,否则还是不会
得到 43,也就不能将 43 赋值给 b
a; // 43
b; // 42

浙公网安备 33010602011771号