你不知道的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
posted @ 2021-03-29 11:16  abcdefgab  阅读(80)  评论(0)    收藏  举报