1. typeof 返回值:==number==、==string==、==Boolean==、==object==、==function====undefined==(null返回object是历史遗留问题)
2. toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果。当括号内有参数n时表示将数字转化为n进制
3. JavaScript Array
1、filter() 方法
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。 注意: filter() 不会对空数组进行检测。 注意: filter() 不会改变原始数组。
//array.filter(function(currentValue,index,arr), thisValue) var arr = [2,78,56,89,4,17,35,28,35,57]; var a = arr.filter(function(item) { return item > 15; }); console.log(a);// [78, 56, 89, 17, 35, 28, 35, 57]2、数组创建的方法
1、[element0, element1, …, elementN] eg. var c = [1,2,3,4,4,6]; 2、new Array(element0, element1[, …[, elementN]]) eg. var b = new Array(1,2,3,4,4,6); 3、new Array(arrayLength) eg. var c = Array(3); //只有一个参数时是表示数组长度,现在数组里面的每一个值都未定义。
3、数组 join() 方法
join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。 注意:如果一个元素为 undefined 或 null,它会被转换为空字符串。
输出结果是 - -、- -、- -、false - false - false、0 - 0 - 0
4. 关于函数的执行顺序
返回结果是1 4 3 2
5. 具名函数表达式(NFE)的特点 - 函数名称只能在函数内部被访问 - 函数名称无法修改
例题
//返回结果是 function 和 undefined
6. 原始值和引用值
一、数据类型分为: (1)不可改变的原始值:number, string, boolean, undefined, null (2)引用值:array, object, function, RegExp,Data 二、他们之间的区别 (1)存储方式不同
原始值存储在栈中。意思就是说,当一个原始变量把值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,此时这两个变量互不影响,即当一个变量值改变时,另一个变量不会因此而发生任何变化。引用值把引用变量存储在栈中,而实际的对象存储在堆中。每一个引用变量都有一根指针指向其堆中的实际对象。 (2)引用值有属性和方法,原始值没有(但是!包装类可以让原始值拥有属性和方法,这个过程是隐式的,eg: string.length是可以查看的)例题
输出结果是 {name:“css”} “1997” //引用值可以直接改,原始值互不影响。
例题
对象是引用值,对象相等指的应该是地址相同,不同地址的对象是不相等的,无论是”=== “ 还是 “==“ 。
7. 如何区分一个变量(arry)是数组还是对象的四种方法(顺便复习)
一、arry.constructor == Array;
constructor是对象的一个属性, 返回创建实例对象的 Object 构造函数的引用。注意: 此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。所有对象都会从它的原型上继承一个 constructor 属性: 例如: 上述代码中的[native code],表示这是JavaScript的底层内部代码实现,无法显示代码细节。 上图是自定义函数的返回值,返回创建该对象的函数的引用。 链接:解释 constructor 有什么用二、arry instanceof Array;
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。语法:object(某个实例对象) instanceof(运算符) constructor(某个构造函数)解释:运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。比如: A instanceof B表示判断A对象的原型上有没有B的原型。三、Object.prototype.toString.call(arry) 推荐使用!
终端object对象带有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。由于Number、Array、Boolean生成包装类时,系统会重新生成自己的toString()覆盖掉原来的,所以在Number、Array、Boolean调用oString() 方法时返回一个表示该对象的to字符串,而不会是"[object type]"格式。2的基础上 + 有些构造函数在定义时也需要自定义自己的toString(),因此需要通过Object.prototype.toString.call()调用终端的toString才能看到类型type。例如:四、Array.isArray(arry)
Array.isArray() 用于确定传递的值是否是一个 Array。如果值是 Array,则为true; 否则为false。当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测iframes.假如不存在 Array.isArray(),还是得回到3的方法去判断。 if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }8. 复习数组
例题
9. parseInt(string, radix)
parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。当radix 小于 2 或大于 36 ,或第一个非空格字符不能转换为数字。从给定的字符串中解析出的一个整数,或者 NaN。 例题MDN详细文档
10. 函数作用域
例题:
输出结果是global,作用域是静态的,函数执行取决于函数定义的位置,而不是函数执行的位置。
11.构造函数
构造函数的内部原理:(有new就开始下面三步) (1)在函数体前隐式地加上this={ } (2)执行this.xxx = xxx; (3)隐式地返回this <注意>:构造函数没使用new之前是一个普通的函数,可以返回原始值。new之后就是构造函数,必须返回对象!例题:
输出结果是 0,undefined,0。由函数预编译的知识可以知道两个0的输出结果,中间的 undefined 比较容易出错。由于有new的存在,可以知道,test此时是作为构造函数存在,因此函数内部会在最开始隐式var一个this对象,并在函数最后返回this。因此第二个this.a明显在构造函数内部未定义。
11. delete操作符,不可配置属性
全局var的属性,一旦经历了var的操作所得到的的属性,成为window上的属性,这种属性叫做不可配置性属性,不可配置的属性,delete不掉可删除。同理,let 或 const 也是不可配置的。delete官方文档
输出结果是4,用delete删除一个数组元素时,数组的长度不受影响。即便你删除了数组的最后一个元素也是如此。delete的数组该位值变成empty。
12. 形参和实参的区别
1、形参变量只有在被调用时才分配内存单元,在调用结束时,就会释放出所分配的内存单元。所以,形参只能在函数内部才有效; 2、实参是:常量、变量、表达式、函数等,实参是何种类型的量,当开始在进行函数调用时,都必须有确定的值; 3、实参和形参在数量,类型上和顺序上必须严格一致,不然就会发生类型不匹配。 4、在一般传值调用的机制中只能把实参传送给形参,因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。
<script> var bar = 1; function foo(bar){ bar = 2; console.log(bar); } foo(bar);//打印出2 console.log(bar);//打印出1 </script>对比
<script> var bar = 1; function foo(){ bar = 2; console.log(bar); } foo();//打印出2 console.log(bar);//打印出2 </script>13、包装类
一道很神奇的题目
console.log(42.toFixed(3)); //报错 console.log((42).toFixed(3)); //42.00014、运算符 1、+ 运算符
(1)对于原始值:比较特殊的是当字符串 + 数字时,应该是等于一个字符串,非数字类型的,生成包装类,强制类型转换。(+ undefined 是 NaN,+ null 是 0) (2)对于引用值,先用Object.prototype.valueOf()方法返回指定对象的原始值,如果返回的不是原始值,再用Object.prototype.toString()方法。
例题
2、== 运算符
比较运算符,存在隐式类型转换,先比类型,再比内容 (1)Number:注意!NaN不等于任何值 (2)String:长度,每一位内容相等才 == (3)Boolean:true 和 false 很好比较 (4)undefined(未定义)和 null(占位符) null == undefined (5)杂交时,也就是不同类型之间的 ==(暂时把这叫双等),类型不同比较时一定转换成数字进行比较,比如 “1” 和 1、0 和 false、 false 和 “0”、null 和 0、false 和 undefined。注意!null 和 undefined 很特殊,他们俩和 0 都不双等,虽然 Number(null) = 0,但是 Number(undefined) = NaN,而 null 双等 undefined,就是这么特殊!
3、运算顺序问题
Javascript里,表达式都是从左向右运算的,一步一步进行。因此在下面这道题中,1 < 2 < 3,是先计算1 < 2 ,结果是ture ,再 ture < 3,隐式转换为1 < 3,所以打印出 true。同理,第二个式子很显然是 1 > 1,显然打印出false。
15、立即执行函数
立即执行函数可以解决闭包问题
ES6的let声明变量也可以快速解决这个问题
16. JS对象
1、对象属性的访问有两种方式,一种是直接 object.firstName ,另一种是 object[" firstName "],要注意[ ] 里面的一定是字符串,如果不是会隐式调用toString方法转换成字符串,下面这道题坑在[ ] b 和 c 是变量,并且变量都是对象,经过toString方法转换之后是一样的字符串,因此相当于给a对象加了一个[‘Object Object’],并修改过他的值,所以最后的输出结果是456。
例题