Published on

JavaScript常用知识点

Authors

一、JS数据类型

1.1、原始数据类型

javascript 的原始数据类型有七种,分别是Number、String、Boolean、null、undefined、symbol 、 BigInt

原始类型数据的特点:值保存在变量本地,且赋值给其他变量后,其它变量改变不影响原来的值,变量存放在栈区的(栈区指内存里的栈内存). 1.boolean true & false

专门用来保存真或者假的类型,值二选一

2.null 空值类型

不指向任何地址,用于手动赋值,清空内容

3.undefined 未定义类型

 只有一个值undefined,用于没有赋值的变量的默认值

4.number 数值类型

 专门保存数字的类型,用于进行数学计算等的数值.
 所占空间:64(8个字节)二进制保存.:一个字节8个位.

5.string 字符串类型

专门用来保存字符串的类型;" ",用来存储字符串类型的文本.
 所占空间:使用unicode标识的.英文字母和标点对应的是1字节,而一个汉字对应的则是两个字节.

6.symbol (ES6新增)

本质上是一种唯一标识符,可用作对象的唯一属性名

7.BigInt (最新)

用于当整数值大于Number数据类型支持的范围时
1、要创建BigInt,只需要在数字末尾追加n即可
console.log( 9007199254740995n );    // → 9007199254740995n
2、创建BigInt的方法是用BigInt()构造函数
BigInt("9007199254740995");    // → 9007199254740995n
1.2、引用数据类型

Object,Function,Array (在JS中除了基本数据类型以外的都是对象,数组是对象,函数是对象,正则表达式是对象) 引用数据类型的特点:引用类型的值是可变的;引用类型的值是保存堆内存中的对象;引用数据类型值的比较本质上是内存地址的比较.

二、原始数据类型和引用数据类型的区别

1、声明变量时内存分配不同

  • 原始类型:在栈中,因为占据空间是固定的,可以将他们存在较小的内存中-栈中,这样便于迅速查询变量的值
  • 引用类型:存在堆中,栈中存储的变量,只是用来查找堆中的引用地址。

2、访问机制不同

  • 在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是按引用访问。
  • 而原始类型的值则是可以直接访问到的。

3、复制变量时的不同

  • 原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
  • 引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。

三、数组常用方法

// 判断对象是否是一个数组(区分数组和对象的方式)
Array.isArray(Obj)  //如果是数组则返回true

arr.toString() //适用于转换全是字符串的数组为字符串,会以逗号分隔开

arr.join('') //适用于转换全是字符串的数组为字符串,可以在中间加入自定义的符号

arr.pop() //删除原数组的最后一个元素,返回值是被移除的元素

arr.push(item) //在原数组末尾处添加一个元素,返回新的数组长度

arr.shift() //删除首个数组元素,返回被移除的元素

arr.unshift() //在开头向数组添加新元素,返回新的数组长度

arr.length //该属性返回数组的长度。可以更简单的向数组追加新元素 arr[arr.length] = 'newItem'

arr.splice(startIndex,0,item1,item2) //向数组添加新的元素,可以指定位置。第二个参数是要删除多少个元素

arr.splice(0,1) //此方法可以删除指定位置的元素

arr.concat(arr1,arr2...) //合并多个数组

arr.slice(startIndex,endIndex) //截取一部分元素组成新的数组。此方法创建新的数组,并不会改变原有的数组。如果省略第一个元素,则截取到数组最后一个元素。

arr.sort() //排序。排序数字可能跟预想的不一样,需要用比值函数处理一下

arr.reverse() //反转排序

//使用 Math.max.apply 来查找数组中的最高值:
function myArrayMax(arr) {
    return Math.max.apply(null, arr);
}

//使用 Math.min.apply 来查找数组中的最低值:
function myArrayMin(arr) {
    return Math.min.apply(null, arr);
}

//迭代数组
arr.forEach(function (item,index,array) {
    //处理
})

//map() 返回新数组,不改变原数组,此方法可以操作每个参数
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);
function myFunction(value, index, array) {
  return value * 2;
}

//filter() 创建一个包含通过测试的数组元素的新数组。参数同map
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);
function myFunction(value, index, array) {
  return value > 18;
}

//reduce() 在每个数组元素上运行函数,生成单个值。方法元素从左到右,不会减少原始数组。例子就是求和数组
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);
function myFunction(total, value, index, array) {
  return total + value;
}

//Array.reduceRight() 在数组中从右到左工作。其他同reduce()

//every() 检查所有数组值是否通过测试。例子检查所有数组值是否大于18,返回false
var numbers = [45, 4, 9, 16, 25];
var allOver18 = numbers.every(myFunction);
function myFunction(value, index, array) {
  return value > 18;
}

//some() 检查某些数组值是否通过测试,只要有一个符合则返回true
//例子中返回true
var numbers = [45, 4, 9, 16, 25];
var someOver18 = numbers.some(myFunction);
function myFunction(value, index, array) {
  return value > 18;
}

arr.indexOf() //在数组中搜索元素值并返回其位置,从0索引开始,未找到则为-1

arr.lastIndexOf() //同indexOf() 知识从末尾开始匹配元素

//arr.find() 方法返回通过测试函数的第一个数组元素的值
var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction);
function myFunction(value, index, array) {
  return value > 18;
}

//arr.findIndex() 返回通过测试函数的第一个索引值。 例子返回25的索引3
var numbers = [4, 9, 16, 25, 29];
var first = numbers.findIndex(myFunction);
function myFunction(value, index, array) {
  return value > 18;
}

四、JavaScript严格模式

"use strict"
  • 禁止this指向window
  • 变量必须有声明才可以使用
  • 删除变量(或对象)是不允许的。 delete x是不允许的
  • 删除函数是不允许的
  • 不允许重复参数名 function x(name1,name1)
  • 不允许八进制数值文本 var x = 010
  • 不允许转义字符
  • 不允许写入只读属性
  • 。。。

五、ES5新的对象方法

// 添加或更改对象属性
Object.defineProperty(object, property, descriptor)

// 添加或更改多个对象属性
Object.defineProperties(object, descriptors)

// 访问属性
Object.getOwnPropertyDescriptor(object, property)

// 将所有属性作为数组返回
Object.getOwnPropertyNames(object)

// 将可枚举属性作为数组返回
Object.keys(object)

// 访问原型
Object.getPrototypeOf(object)

// 防止向对象添加属性
Object.preventExtensions(object)

// 如果可以将属性添加到对象,则返回 true
Object.isExtensible(object)

// 防止更改对象属性(而不是值)
Object.seal(object)

// 如果对象被密封,则返回 true
Object.isSealed(object)

// 防止对对象进行任何更改
Object.freeze(object)

// 如果对象被冻结,则返回 true
Object.isFrozen(object)