了解基本数据类型:类型检查、类型转换、不同类型间运算结果
1、基本类型:Number
Boolean
String
Undefined
(未定义类型) Null
(存放在栈内存中)
2、类型转换
- 基本数据类型转换成数值类型
- 基本数据类型转换成字符串类型
- 基本数据类型转换成转换成布尔类型
例子:
// null转换为0; undefined转换为NaN(NaN其本质是一个number)
5 + null // 返回 5 因为 null 被转换为 0
// 空字符串转换成数值时,为0
// 字符串中既包含数字还包含字母,例如 ”abc123”,那么转换之后就是NaN
'abc123' // 返回NaN
// 通过 变量/常量 + ""/’’ 来转换为字符串,底层的本质其实就是调用String()函数
// 将null空类型通过String()的方式转换为字符串类型,转换之后还是null
// 将undefined未定义类型通过String()的方式转换为字符串类型,转换之后还是undefined
"5" + null // 返回 "5null" 因为 null 被转换为 "null"
"5" + 2 // 返回 52 因为 2 被转换为 "2"
// 通过+/-都将其它类型转换为数值类型
"5" - 2 // 返回 3 因为 "5" 被转换为 5
"5" * "2" // 返回 10 因为 "5" 和 "2" 被转换为 5 和 2
// 空字符串/0/NaN/undefined/null 转换成布尔类型时,会转换成false, 其它的都是true
==
:先转换类型,再比较
===
:全等于,不转换类型直接比较
3、类型检查
typeof
、instanceof
、constructor
、Object.prototype.toString.call()
// typeof对引用数据类型不起作用;对基本数据类型null输出的是object
console.log(typeof []); // object
console.log(typeof {
}); // object
console.log(typeof null); // object
console.log(typeof function(){
}); // function
// instanceof对引用数据类型有用,对于基本数据类型,需要先new对象
// Object.prototype.toString.call()能完全判断基本数据类型和引用数据类型
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call([])); // [object Array]
了解引用类型:类型检查、不同类型间运算结果
引用类型:Object
Function
(存放在堆内存中)(Arry也是属于object对象)

数组的基本操作:获取数组项数、栈方法、队列方法、排序方法、遍历方法、判断变量为数组的方法、伪数组、数组扁平化、数组去重、数组乱序
1、栈方法 ------ 提供push()和pop()方法,实现类似栈的行为
push()向数组末尾添加项,返回修改后数组长度。pop()从数组末尾移除最后一项,减少数组长度,返回移除的项。
2、队列方法 ------ 提供push()和shift()方法,实现类似队列的行为
shift()移除数组中的第一个项并返回该项,同时将数组长度减1。
【补充】unshift()方法,它能在数组前端添加任意个项,并返回新数组的长度。
3、排序
- 默认地,sort() 函数根据字符串Unicode码进行排序
- 比较函数实现数值排序:
nums.sort((a,b) = > a-b); // 升序
4、遍历
- for循环
- for in(不仅可以遍历数组,还可以遍历对象)
- for of
- forEach(遍历数组,不能break 或者return)
- 其他方法:Map,Reduce,Filter,Every,some方法都是面向数组的,不是普通对象
- JavaScript中数组中遍历的方法
5、判断变量为数组的方法
1)instanceof
var arr=[];
console.log(arr instanceof Array); //返回true
2)constructor
console.log([].constructor == Array); // 返回true
3)Object.prototype.toString.call(arr) === “[object Array]”
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
console.log(isArray([])); // 返回true
// 或者直接这样:
console.log(Object.prototype.toString.call([]) === '[object Array]') // 返回true
4)Array.isArray()
console.log(Array.isArray([]) )// 返回true
6、伪数组
arguments对象:
arguments对象是所有(非箭头)函数中都可用的局部变量,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。
当实参的个数比形参的个数多的时候,则可以通过arguments来访问实参。
arguments对象不是一个 Array(伪数组),除了length属性和索引元素之外没有任何Array属性。
arguments.length为函数实参个数,arguments.callee引用函数自身。
但是它可以被转换为一个真正的Array:
// 方法一:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// 方法二:
const args = Array.from(arguments);
// 方法三:
const args = [...arguments];
伪数组:
伪数组就是类似数组的对象,例如:
obj={
"0":"zhang",
"1":18,
length:2
}
// 这个就是伪数组,含有length属性
主要有以下两类:
1)典型的是函数的 argument参数
2)像调用getElementsByTagName,document.childNodes之类的,它们都返回 NodeList对象都属于伪数组
7、数组扁平化(flatten)
扁平化就是将嵌套的数组变成一维数组的过程。
参考博客:JS 扁平化(flatten) 数组、JavaScript 专题之数组扁平化
8、数组去重
利用set对象。
9、数组乱序
方法:sort和Math.random()结合、Fisher-Yates
参考博客:javaScript如何实现真正的数组乱序?、「前端进阶」数组乱序
字符串方法
1)length
2)str[]、charAt()、charCodeAt()
3)indexOf()、lastIndexOf()
4)search(),一般与正则表达式配合使用
5)slice()、substring()、substr()
6)replace()、concat()
7)toUpperCase()、toLowerCase()
8)trim()删除字符串两端的空白符
9)split()将字符串转换成数组,可接受正则匹配
闭包
作用域(全局变量和局部变量)
函数内部的变量声明,若没有使用关键字var,则该变量被当做全局变量使用。
函数内部的变量可以读取全局变量;函数外部的变量不能读取函数内的局部变量,怎么解决这个呢,那就使用闭包。
闭包:
- 能读取其他函数内部变量的函数,也可以说是定义在函数内部的函数(子函数)。
匿名函数(没有函数名的函数)的两种定义方式:
var double = function(x){return x+x;}
(function(x,y){alert(x+y)})(2,3)
第一个括号创建匿名函数,第二个括号传入参数调用该函数
闭包的用途:
- 读取函数内部的变量
- 让这些变量的值始终保存在内存中
参考博客:学习Javascript闭包、JavaScript中的匿名函数及函数的闭包
DOM
事件
事件处理、事件冒泡、事件捕获、事件委托、浏览器事件机制(DOM事件流,即捕获、目标、冒泡)
事件绑定方式(也叫做事件监听方式,如onclick类型的传统事件绑定方式、HTML触发、addEventListener())
事件循环与消息队列
参考博客:JavaScript事件处理、JavaScript事件处理机制、原生js——事件监听方法、JavaScript 事件循环机制、
JS事件模型
变量提升和函数提升(预编译)
函数提升和函数表达式(分为匿名函数表达式和具名函数表达式)
JavaScript中的函数是一等公民,函数声明的优先级最高,它永远被提升至作用域最顶部,然后才是函数表达式和变量按顺序执行。
例子:
var foo = 3;
function hoistFunction() {
console.log(foo); // 此处会打印函数 function foo() {}
foo = 5;
console.log(foo); // 5
function foo() {
}
}
hoistFunction();
console.log(foo); // 3
预编译之后:
// 预编译之后
var foo = 3;
function hoistFunction() {
var foo;
foo = function foo() {
};
console.log(foo); // function foo() {}
foo = 5;
console.log(foo); // 5
}
hoistFunction();
console.log(foo); // 3
get和post方法如何传输数据,node.js中使用什么属性接收参数
1、GET参数通过URL传递,POST放在Request body中;
2、使用中间件body-parser 获取post数据;
3、req.query解析get请求中的参数,req.body解析post请求中的数据,req.params包含路由参数(在URL的路径部分),而req.query包含URL的查询参数(在URL的?后的参数)。