JS零碎知识点记录(不断更新)

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;

  1. constructor是对象的一个属性, 返回创建实例对象的 Object 构造函数的引用。注意: 此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。
  2. 所有对象都会从它的原型上继承一个 constructor 属性:
    例如: 在这里插入图片描述
  • 上述代码中的[native code],表示这是JavaScript的底层内部代码实现,无法显示代码细节。
    在这里插入图片描述
  • 上图是自定义函数的返回值,返回创建该对象的函数的引用。
    链接:解释 constructor 有什么用

二、arry instanceof Array;

  1. instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
  2. 语法:object(某个实例对象) instanceof(运算符) constructor(某个构造函数)
  3. 解释:运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。比如: A instanceof B表示判断A对象的原型上有没有B的原型。
    在这里插入图片描述

三、Object.prototype.toString.call(arry) 推荐使用!

  1. 终端object对象带有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。
  2. 由于Number、Array、Boolean生成包装类时,系统会重新生成自己的toString()覆盖掉原来的,所以在Number、Array、Boolean调用oString() 方法时返回一个表示该对象的to字符串,而不会是"[object type]"格式。
  3. 2的基础上 + 有些构造函数在定义时也需要自定义自己的toString(),因此需要通过Object.prototype.toString.call()调用终端的toString才能看到类型type。例如:在这里插入图片描述

四、Array.isArray(arry)

  1. Array.isArray() 用于确定传递的值是否是一个 Array。如果值是 Array,则为true; 否则为false。
  2. 当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测iframes.
  3. 假如不存在 Array.isArray(),还是得回到3的方法去判断。
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
 };
}

8. 复习数组

一、改变原数组的方法
  • push 从数组尾部向数组中插入数据,改变原数组,返回值是当前数组的长度,参数是插入的数据。
  • pop 从数组尾部弹出数据,改变原数组,返回值是弹出的数据,不需要参数。
  • push + pop 实现栈结构(数据结构)// FIL。O先进后出(盘子)
  • unshift 从数组头部插入数据,改变原数组,返回值是当前数组的长度,参数是插入的数据。
  • shift 从数组头部弹出数据,改变原数组,返回值是弹出的数据,不需要参数。
  • push + shift 队列结构(数据结构)// FIFO先进先出排队

例题
在这里插入图片描述

返回值是2,要对数组的各个方法的很熟,包括返回值!
  • reverse( ) 逆转数组顺序,返回逆转顺序的数组,不用传参
  • sort( ) 给数组排序,不过是按Ascall码值排序的,不用传参。升序再调用一次 sort( ).reverse( ) 。如果要实现按正常顺序排序可以内置函数实现。
    //sort( )的内置函数的规则:
    (1)必须写俩参数
    (2)看返回值,当返回值为负数时,那么前面的参数排前面;当返回值为正数时,那么后面的参数排前面;当返回值为0时,不动。
    (3)参数的输入方式是冒泡排序
	//sort( )的内置函数
	arry.sort(function(a,b){return a - b});//升序
	arry.sort(function(a,b){return b - a});//降序
	arry.sort(function( ){return Math.random() - 0.5;});//乱序
  • splice:数组切片,用法splice(从第几位开始,截取多少长度,在切口处添加新的数据1,在切口处添加新的数据2······),返回值是截取的部分。
二、不改变原数组的方法
  • concat:连接数组,用法 a.concat(b),b可以是数组也可以是数字,参数可由多个甚至混合,由于不改变原数组,返回值是一个新的数组,需要定义一个变量去接收。
  • join:将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符,用法:arr.join(“用来连接的字符”),返回值也是字符串形式的连接之后的字符串。(与字符串的splice方法是互逆的过程)
  • toString:将数组转化为字符串
  • slice:数组截取片段,用法slice(从第几位开始,截取到第几位),由于不改变原数组,返回值是一个新的数组,需要定义一个变量去接收。只有一个参数时表示从该位一直截取到最后,无参数表示整个截取(空截)。

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.000

14、运算符
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。

例题
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值