JS基础知识

一、JS的数据类型

基本数据类型

JS中有6种基本数据类型,分别为:StringNumberBooleanNullUndefinedSymbol

其中NullUndefined是空值类型,Symbol是ES6中新增的一种类型,表示独一无二的值。

引用数据类型

引用数据类型包括ObjectArrayFunctionDateRegExp等。

二、JS的数据类型判断

typeof

typeof可以用来判断一个变量是什么类型的数据,但是它对于引用类型的数据来说,除了function类型以外,都会返回object

typeof 'hello' // 'string' typeof 10 // 'number' typeof true // 'boolean' typeof undefined // 'undefined' typeof null // 'object' typeof Symbol('symbol') // 'symbol' typeof [] // 'object' typeof {} // 'object' typeof function () {} // 'function'

instanceof

instanceof可以用来判断一个变量是不是某个类的实例,但是它不能用来判断基本数据类型。

[] instanceof Array // true {} instanceof Object // true function(){} instanceof Function // true new Date() instanceof Date // true /\d+/g instanceof RegExp // true

Object.prototype.toString

Object.prototype.toString可以用来判断一个变量的具体类型,但是它不能用来判断基本数据类型。

Object.prototype.toString.call('hello') // '[object String]' Object.prototype.toString.call(10) // '[object Number]' Object.prototype.toString.call(true) // '[object Boolean]' Object.prototype.toString.call(undefined) // '[object Undefined]' Object.prototype.toString.call(null) // '[object Null]' Object.prototype.toString.call(Symbol('Symbol')) // '[object Symbol]' Object.prototype.toString.call([]) // '[object Array]' Object.prototype.toString.call({}) // '[object Object]' Object.prototype.toString.call(() => {}) // '[object Function]' Object.prototype.toString.call(new Date()) // '[object Date]' Object.prototype.toString.call(/\d+/g)

三、JS的数据类型转换

转换为字符串

  • String():可以将任意类型的值转换为字符串,但是nullundefined转换后的结果是'null''undefined'
  • toString():可以将数字、布尔值、对象转换为字符串,但是不能转换nullundefined
  • +'':可以将任意类型的值转换为字符串,但是不能转换nullundefined
  • JSON.stringify():可以将任意类型的值转换为字符串,但是不能转换undefined

转换为数字

  • Number():可以将任意类型的值转换为数字,但是null转换后的结果是0undefined转换后的结果是NaN
  • parseInt():可以将字符串转换为数字。
  • parseFloat():可以将字符串转换为浮点数。
  • +:可以将任意类型的值转换为数字,但是不能转换nullundefined

转换为布尔值

  • Boolean():可以将任意类型的值转换为布尔值,但是nullundefinedNaN''0false转换后的结果是false,其余的值都是true

四、JS的内置对象

Math

Math对象是一个数学工具对象,它提供了很多数学方法和常量,可以直接通过Math对象调用。

Math.PI // 3.141592653589793 Math.abs(-1) // 1 Math.ceil(1.1) // 2 Math.floor(1.9) // 1 Math.round(1.5) // 2 Math.max(1, 2, 3) // 3 Math.min(1, 2, 3) // 1 2 ** 3 // 8 Math.random() // 0.130075436 Math.sqrt(4) // 2

Date

Date对象用来处理日期和时间,它提供了很多方法,可以直接通过Date对象调用。

let date = new Date() // 2021-05-18T02:38:14.000Z let date = new Date('2021-05-18') // 2021-05-18T00:00:00.000Z let date = new Date('2021-05-18 10:00:00') // 2021-05-18T02:00:00.000Z let date = new Date(2021, 4, 18) // 2021-05-17T16:00:00.000Z let date = new Date(2021, 4, 18, 10, 0, 0) // 2021-05-18T02:00:00.000Z let date = new Date().getTime() // 1621315094000 let date = new Date().getFullYear() // 2021 let date = new Date().getMonth() // 4 let date = new Date().getDate() // 18 let date = new Date().getHours() // 10 let date = new Date().getMinutes() // 38 let date = new Date().getSeconds() // 14 let date = new Date().getMilliseconds() // 0

JSON

JSON对象是用来处理JSON数据的,它提供了两个方法:JSON.stringify()JSON.parse()

JSON.stringify()方法可以将一个对象或者数组转换为JSON字符串。

JSON.parse()方法可以将一个JSON字符串转换为对象或者数组。

JSON.stringify({ name: '张三', age: 20 }) // '{"name":"张三","age":20}' JSON.parse('{"name":"张三","age":20}') // {name: '张三', age: 20}

Array

Array对象用来处理数组,它提供了很多方法,可以直接通过Array对象调用。

Array.isArray([]) // true Array.isArray({}) // false Array.prototype.push() // 添加元素到数组尾部 Array.prototype.pop() // 删除数组尾部的元素 Array.prototype.shift() // 删除数组头部的元素 Array.prototype.unshift() // 添加元素 Array.prototype.concat() // 连接数组 Array.prototype.join() // 将数组转换为字符串 Array.prototype.slice() // 截取数组 Array.prototype.splice() // 删除元素 Array.prototype.reverse() // 反转数组 Array.prototype.sort() // 排序数组 Array.prototype.indexOf() // 查找元素 Array.prototype.lastIndexOf() // 查找元素 Array.prototype.forEach() // 遍历数组 Array.prototype.map() // 映射数组 Array.prototype.filter() // 过滤数组 Array.prototype.every() // 判断数组中的每个元素是否都满足条件 Array.prototype.some() // 判断数组中是否有元素满足条件 Array.prototype.reduce() // 求和 Array.prototype.reduceRight() // 求和

String

String对象用来处理字符串,它提供了很多方法,可以直接通过String对象调用。

String.prototype.charAt() // 获取指定位置的字符 String.prototype.charCodeAt() // 获取指定位置的字符的Unicode编码 String.prototype.concat() // 拼接字符串 String.prototype.indexOf() // 查找子串 String.prototype.lastIndexOf() // 查找子串 String.prototype.slice() // 截取字符串 String.prototype.substring() // 截取字符串 String.prototype.substr() // 截取字符串 String.prototype.split() // 分割字符串 String.prototype.replace() // 替换字符串 String.prototype.toLowerCase() // 转换为小写 String.prototype.toUpperCase() // 转换为大写 String.prototype.trim() // 去除字符串两边的空格 String.prototype.match() // 匹配 String.prototype.search() // 查找 String.prototype.repeat() // 重复 String.prototype.startsWith() // 判断是否以指定字符串开头 String.prototype.endsWith() // 判断是否以指定字符串结尾 String.prototype.includes() // 判断是否包含指定字符串

RegExp

RegExp对象用来处理正则表达式,它提供了很多方法,可以直接通过RegExp对象调用。

RegExp.prototype.test() // 判断字符串是否符合正则表达式 RegExp.prototype.exec() // 匹配正则表达式

五、JS的函数

函数的定义

函数是一段可以重复执行的代码块,可以通过函数名来调用函数。

function fn() { console.log('fn函数被调用了') } fn() // fn函数被调用了

函数的参数

函数可以接收参数,参数可以是任意类型,一个函数可以接收多个参数。

function fn(a, b) { console.log(a, b) } fn(1, 2) // 1 2

函数的返回值

函数可以返回一个值,如果函数没有返回值,则返回undefined

function fn() { return 'hello' } console.log(fn()) // hello

函数的调用

函数可以通过函数名来调用,如果函数没有返回值,则返回undefined

function fn() { console.log('fn函数被调用了') } fn() // fn函数被调用了

函数的内部变量

函数内部可以定义变量,这些变量只能在函数内部使用,函数外部无法使用。

function fn() { const a = 1 } console.log(a) // a is not defined

函数的内部函数

函数内部可以定义函数,这些函数只能在函数内部使用,函数外部无法使用。

function fn() { function fn2() { console.log('fn2函数被调用了') } fn2() } fn() // fn2函数被调用了 console.log(fn2) // fn2 is not defined

函数的参数作用域

函数的参数也是函数内部的变量,只能在函数内部使用,函数外部无法使用。

function fn(a, b) { console.log(a, b) } fn(1, 2) // 1 2 console.log(a, b) // a is not defined

函数的参数默认值

函数的参数可以设置默认值,如果调用函数时没有传递参数,则会使用默认值。

function fn(a = 1, b = 2) { console.log(a, b) } fn() // 1 2 fn(3) // 3 2 fn(3, 4) // 3 4

函数的参数解构赋值

函数的参数可以使用解构赋值,可以直接获取对象中的属性值。

function fn({ a, b }) { console.log(a, b) } fn({ a: 1, b: 2 }) // 1 2

函数的参数不定长

函数的参数可以使用...来表示,表示参数的个数不定长。

function fn(...args) { console.log(args) } fn(1, 2, 3) // [1, 2, 3]

函数的立即执行

函数可以立即执行,可以通过()来调用函数。

(function () { console.log('立即执行') })() // 立即执行

函数的重载

函数可以定义多个,函数名相同,参数个数不同,这样就实现了函数的重载。

function fn(a) { console.log(a) } function fn(a, b) { console.log(a, b) } fn(1) // 1 fn(1, 2) // 1 2

函数的递归

函数可以调用自身,这样就实现了函数的递归。

function fn(a) { if (a === 0) { return 0 } return a + fn(a - 1) } console.log(fn(100)) // 5050

函数的闭包

函数可以返回一个函数,这样就实现了函数的闭包。

function fn() { const a = 1 return function () { console.log(a) } } const f = fn() f() // 1

函数的箭头函数

函数可以使用箭头函数的形式来定义函数,这样就实现了函数的箭头函数。

const fn = () => { console.log('箭头函数') } fn() // 箭头函数

六、JS的运算符

算术运算符

算术运算符用来进行算术运算,返回的结果是一个数值。

console.log(1 + 2) // 3 console.log(1 - 2) // -1 console.log(1 * 2) // 2 console.log(1 / 2) // 0.5 console.log(1 % 2) // 1 console.log(1 ** 2) // 1

赋值运算符

赋值运算符用来给变量赋值,返回的结果是一个数值。

const a = 1 console.log(a) // 1

比较运算符

比较运算符用来比较两个值的大小,返回的结果是一个布尔值。

console.log(1 > 2) // false console.log(1 >= 2) // false console.log(1 < 2) // true console.log(1 <= 2) // true console.log(1 == 2) // false console.log(1 != 2) // true console.log(1 === 2) // false console.log(1 !== 2) // true

逻辑运算符

逻辑运算符用来进行逻辑运算,返回的结果是一个布尔值。

console.log(true && false) // false console.log(true || false) // true console.log(!true) // false

位运算符

位运算符用来进行位运算,返回的结果是一个数值。

console.log(1 & 2) // 0 console.log(1 | 2) // 3 console.log(1 ^ 2) // 3 console.log(~1) // -2 console.log(1 << 2) // 4 console.log(1 >> 2) // 0 console.log(1 >>> 2) // 0

三元运算符

三元运算符用来进行条件运算,返回的结果是一个值。

console.log(1 > 2 ? 1 : 2) // 2

逗号运算符

逗号运算符用来进行逗号运算,返回的结果是最后一个运算的值。

console.log((1, 2)) // 2

七、JS的语句

条件语句

条件语句用来进行条件判断,根据不同的条件执行不同的代码。

if (true) { console.log('条件成立') } else { console.log('条件不成立') } switch (1) { case 1: console.log(1) break case 2: console.log(2) break default: console.log('default') }

循环语句

循环语句用来进行循环操作,根据不同的条件重复执行相同的代码。

for (let i = 0; i < 10; i++) { console.log(i) } let i = 0 while (i < 10) { console.log(i) i++ } let i = 0 do { console.log(i) i++ } while (i < 10)

跳转语句

跳转语句用来进行跳转操作,根据不同的条件跳转到不同的位置。

break continue return throw

八、JS的对象

对象的定义

对象是由多个键值对组成的,键值对之间使用,分隔,键和值之间使用:分隔,键必须是字符串,值可以是任意类型。

const obj = { a: 1, b: 2, c: 3 }

对象的读取

对象的键值对可以使用.来进行读取,如果键名是一个变量,则需要使用[]来进行读取。

const obj = { a: 1, b: 2, c: 3 } console.log(obj.a) // 1 console.log(obj.a) // 1 const key = 'a' console.log(obj[key]) // 1

对象的修改

对象的键值对可以使用.来进行修改,如果键名是一个变量,则需要使用[]来进行修改。

const obj = { a: 1, b: 2, c: 3 } obj.a = 4 console.log(obj.a) // 4 obj.a = 5 console.log(obj.a) // 5 const key = 'a' obj[key] = 6 console.log(obj[key]) // 6

对象的添加

对象的键值对可以使用.来进行添加,如果键名是一个变量,则需要使用[]来进行添加。

const obj = { a: 1, b: 2, c: 3 } obj.d = 4 console.log(obj.d) // 4 obj.e = 5 console.log(obj.e) // 5 const key = 'f' obj[key] = 6 console.log(obj[key]) // 6

对象的删除

对象的键值对可以使用.来进行删除,如果键名是一个变量,则需要使用[]来进行删除。

const obj = { a: 1, b: 2, c: 3 } delete obj.a console.log(obj.a) // undefined delete obj.b console.log(obj.b) // undefined const key = 'c' delete obj[key] console.log(obj[key]) // undefined

对象的遍历

对象的键值对可以使用for...in来进行遍历。

const obj = { a: 1, b: 2, c: 3 } for (const key in obj) { console.log(key, obj[key]) }

九、JS的数组

数组的定义

数组是由多个元素组成的,元素之间使用,分隔,元素可以是任意类型。

const arr = [1, 2, 3]

数组的读取

数组的元素可以使用索引来进行读取,索引从0开始。

const arr = [1, 2, 3] console.log(arr[0]) // 1 console.log(arr[1]) // 2 console.log(arr[2]) // 3

数组的修改

数组的元素可以使用索引来进行修改,索引从0开始。

const arr = [1, 2, 3] arr[0] = 4 console.log(arr[0]) // 4 arr[1] = 5 console.log(arr[1]) // 5 arr[2] = 6 console.log(arr[2]) // 6

数组的添加

数组的元素可以使用索引来进行添加,索引从0开始。

const arr = [1, 2, 3] arr[3] = 4 console.log(arr[3]) // 4 arr[4] = 5 console.log(arr[4]) // 5 arr[5] = 6 console.log(arr[5]) // 6

数组的删除

数组的元素可以使用索引来进行删除,索引从0开始。

const arr = [1, 2, 3] arr.splice(0, 1) console.log(arr[0]) // 2 arr.splice(0, 1) console.log(arr[0]) // 3 arr.splice(0, 1) console.log(arr[0]) // undefined

数组的遍历

数组的元素可以使用for来进行遍历。

const arr = [1, 2, 3] for (let i = 0; i < arr.length; i++) { console.log(arr[i]) }