JS的基本知识
一、语法
1.1、区分大小写
JS中的一切都区分大小写,包括(变量名、函数名、操作符等),例如:
test!== Test // true
1.2、标识符
标识符,即变量、函数名、属性的名字,函数参数也算是变量的一种,因此函数参数也是标识符,标识符具有以下规则:
1、首字符必须是字母、下划线()、美元符号
2、其他字符可以是字母、下划线()、美元符号($)、数字
按照惯例,标识符一般采用驼峰命名方式,即首字母小写,剩余单词开头字母大写。例如:peopleAge
、peopleName
。
1.3、注释
JavaScript注释方法:
// 单行注释
/*
*多行注释
*/
HTML注释方法:
<!-- HTML注释 -->
1.4、严格模式
启用方式:在需要执行严格模式条件的代码前加上"use strict";
,例如:
// 执行getAge方法会报错,因为在严格模式下age没有事先声明
function getAge(){
"use strict";
age = 14;
console.log(age);
}
// getName方法会正常进行,在"use strict"后的代码符合严格模式的标准
function getName(){
"use strict";
let name = '';
name = 'web';
console.log(name);
}
二、变量
ES5 | ES6 |
---|---|
var | var、let、const |
在ES6之前声明变量的方式只有var
,它具有以下特性:
1、属于松散类型 ,可以用来声明所有类型数据,
2、使用var
声明的变量只会在其作用域内有效,离开作用域就会被销毁。具有以下情况:
3、在非局部作用域内使用var声明语句声明的变量会作用于全局作用域
4、var
具有变量提升,即会将声明语句提升到该作用域头部,但未赋值,因此在声明前调用该变量并不会报错,而是返回一个undefined
,
A、局部变量声明
function _test(){
var testStr = 'hello'
}
_test();
console.log(testStr); // 会报错,函数具有自己的作用域,testStr在函数内声明,离开函数作用域后将会被销毁,所以外部访问会报错
B、代码块内声明
{
var testStr = 'hello'
}
console.log(testStr); // 输出hello,在es6之前js代码是没有块级作用域的概念的,所以该代码块内的声明其实仍然是属于全局作用域内的
C、先用后声明
console.log(testStr); //并不会报错,因为var声明变量存在变量提升,只会输出undefined
{
var testStr = 'hello'
}
// 上面的声明实际是以下顺序,变量提升会将变量提前声明,但不会赋值,函数声明的时候也具有该特性
var testStr;
console.log(testStr);
{
testStr = 'hello'
}
四、数据类型
数据类型又分为基本数据类型和引用数据类型,基本数据类型包括undefined、null、number、string、boolean。引用数据类型一般是指Object,但在ES6发布后又定义了几种数据类型:symbol、map、set。
对于简单类型数据,js提供了一个typeof方法用于检测变量的数据类型,具体如下:
const num = 0;
const str = "hello";
const str2 = undefined;
const obj = null;
const aa = true;
const object = {};
const array = []
const fn = function(){}
console.log(typeof num); //number
console.log(typeof str); //string
console.log(typeof str2); //undefined
console.log(typeof obj); //object
console.log(typeof aa); //boolean
console.log(typeof object); //object
console.log(typeof array); //object
console.log(typeof fn); //function
这里需要注意3个地方:
null
是一个空对象,因此typeof
的检测结果为object
;function
的检测结果会返回function
,并不是一个object
;Array
类型虽然是数组,但是在JavaScript
中我们认为他的类型是对象类型。
五、操作符
5.1 一元操作符
只能操作一个值的操作符叫一元操作符;
1、递增和递减
使用方法:a++,++a,a–,--a
它表达的意思就是对a进行加一的操作,但需要注意的是++和–的位置:
- ++或–在前表示先加或减再用
- ++或–在后表示先用再加或减
let a = 2;
console.log(a++) // 先用再加,输出2,a最终会更新为3;
console.log(++a) //先加后用,输出4,a更新为4;
console.log(a--) //先用再减,输出4,a更新为3
console.log(--a) //先减再用,输出2,a更新为2
++和–也可以运用到其他类型值上,但须遵循以下规范:
1、应用于一个包含有效数字字符的字符串时,先将其转换为数值,再执行++/–,该变量类型由字符串类型变为数值类型
2、应用于一个不包含数字字符的字符串时,将变量的值设置为NaN
,该变量类型由字符串类型变为数值变量;
3、应用于布尔值false
时,先将其转换为0,再执行++/–,该变量的类型由布尔值转换为数值;
4、应用于布尔值true
时,先将其转换为1,再执行++/–,该变量的类型由布尔值转换为数值;
5、应用于undefined
时,数值运算会返回NaN
5、在应用于对象时,会调用对象的valueOf()
方法取得一个可用值,然后再利用前面的规则,如果结果是NaN
,则再调用toString()
方法后再应用前面的规则,该变量类型将由对象变为数值
2、一元加和一元减运算符
在对非数值应用一元操作加减符时,该操作Number()转型函数一样对这个值进行转换;用法如下:
let a = 0;
a = +a;
a = -a;
需要注意的是上面的语法并没有进行加减运算,实际上只是进行了一个将变量的类型转换为数值类型的过程。
5.2 布尔操作符
1、逻辑非(!)
当对一个变量使用逻辑非操作后,无论变量是什么类型都会先将其变为布尔类型,再进行取反操作;
1、操作对象是一个对象,则返回
false
;
2、操作对象是一个非空字符串,返回false
;
3、操作对象是一个空字符串,返回true
;
4、操作对象是0;返回true
;
5、操作对象是非0数值,返回false
;
6、操作对象是null
,返回true
7、操作对象是undefined
,返回true
8、操作对象是NaN
,返回true
逻辑非操作一次会将其转为布尔值再取反,那么连续使用两次其实就取到了当前对象的布尔类型值,相当于做了Boolean()转化;
2、逻辑与(&&)
它具有两个操作对象,使用方法是将两个操作对象分别放在&&
两边,例如:
a && b;
他的返回结果可以简单记忆为只有同时为真才返回true
,并返回后面的那个操作对象;其他情况皆是返回false
,并返回第一次最先碰见的布尔类型为false
的那个操作对象,并且遇见false
将立即停止执行逻辑与的后续代码。
3、逻辑或(||)
逻辑或和逻辑与的用法一直,都是两个操作对象将||
包含住。
逻辑或可以理解为遇见操作对象为真则立即返回当前操作对象,后续的逻辑或比较不再执行
六、语句
很简单,没啥可记录的
七、函数
这里主要了解一下函数的传参原理(按值传递)这个可以参考我之前的文章看看以及JavaScript中没有函数重载,当然你也可以借助一些方法去实现这个。