本文已参与「新人创作礼」活动,一起开启掘金创作之路。
标识符
1.在JS中所有可以有我们自主命名的都可以称为是标识符。
2、例如:变量名、函数名,属性名都属于标识符
-
命名有一个标识符的规则
1.标识符可以含有字母、数字、_、$
2.可以使用 Unicode 转义序列。例如,字符 a 可以使用“\u0061”表示。
3.标识符不能是ES中的关键字(break、for。。)或保留字(class、import、public。。)
- 标识符一般都采用驼峰命名法
- 首字母小写,每个单词开头字母大写,其余字母小写
- helloWorld xxxYyyUuu
- 标识符一般都采用驼峰命名法
字符串
JS中一共八种数据类型
其中七种为原始数据类型
- String 字符串
- Number 数值
- Boolean 布尔值
- Null 空值
- Undefined 未定义
- BigInt 最大值
- Symbol 标志
其中前五个为基本数据类型,object属于引用数据类型
转义符 \ 可以在字符串中使用
- 当使用一些特殊符合时使用
- 比如 \ '' 表示''
- \n 表示换行
- \t 表示制表符 \ \ 表示 \
Number 数值
涉及浮点数的计算容易出现误差
Null (空值)
表示一个空的对象,使用typeof 检查null值时会返回一个object
Undefined (未定义)
声明一个变量,但是并未赋值时,它的值就时Undefined,typeof 检查会返回Undefined
Object ( 对象 )
判断是否为一个对象
1、toString(推荐)
var obj = {};
Object.prototype.toString.call(obj) === '[object Object]'
2、constructor
var obj = {};
obj.constructor === Object
3、instanceof 需要注意的是由于数组也是对象,因此用 arr instanceof Object 也为true。
var obj = {};
obj instanceof Object
4、typeof
typeof function() {} 'function'
typeof {} 'object'
typeof [] 'object'
typeof null 'object' // 使用type of 判断null对象不准确
判断是否为一个数组
一、Array.isArray
ES5新增的数组方法,Array.isArray应该是我们最先想到的判定方式,现在应用的也比较广泛。
const arr = [1,2,3,4]``Array.isArray(arr) ``// true
如果是在支持ES5的浏览器中,用这样的方式自然没什么问题,但是如果是在IE9以下版本,这个方法并未受到支持,这时候我们就要用别的方式来判断数组。
二、instanceof
一般来说,instanceof关键字,是用来判断某个元素是否某对象构造函数实例。在数组判断上,instanceof关键字也可以进行数组的判定。
const arr = [1, 2, 3, 4]``arr ``instanceof` `Array ``// true
instanceof支持的浏览器版本比较多,所以一般来说,用instanceof判断,会比Array.isArray判定的范围要广泛。
三、toString
对象的toString方式也可以判定数组类型,一般来说这种方式的判定是各大库的一种Array.isArray的代替实现。
例如,polyfill中,就是如此实现:
const arr = [1, 2, 3, 4]``Object.prototype.toString.call(arr) === ``'[Object Array]'` `// true
四、constructor
除了以上的方式之外,我们还可以通过构造函数来判定:
const arr = [1, 2, 3, 4]``arr.constructor === Array ``// true``arr.__proto__.constructor === Array ``//true
弊端
instanceof和constructor的判定也存在一些弊端,他们判定的数组必须定义在同一个页面,否则将会判定为false。
如果在iframe中的数组判定,就会出错。
判断null、undefined与NaN
注意:
null == undefined
判断三个的取反都为true
var tmp = null;
if (!tmp)
{
alert("null or undefined or NaN");
}
1、判断 undefined
var tmp = undefined;
if (typeof(tmp) == "undefined"){
alert("undefined");
}
2、判断 null
var tep = null
if(!tep && typeof(tep) != 'undefined' && typeof(tep) != 'number' && tep !=0){
alert('null')
}
3、判断NaN:
NaN(不是一个数字且数据类型为number,另外NaN != NaN)是执行数学运算没有成功,返回失败的结果。但是这个结果仍然是数字类型。
1、利用NaN是唯一一个不等于任何自身的特点。
var a = "str";
var b = 2;
var c = a/b;
function isNaN(n) {
if(n !== n) {
return true;
} else {
return false;
}
}
console.log(isNaN(a)); // false
console.log(isNaN(b)); // false
console.log(isNaN(c)); // true
2、利用ES6中提供的Object.is()方法。
var a = "str";
var b = 2;
var c = a/b;
console.log(Object.is(a, NaN)); // false
console.log(Object.is(b, NaN)); // false
console.log(Object.is(c, NaN)); // true
3、结合 isNaN进行判断
Number.NaN不会进行数值转化isNaN会进行数值转化
// 优化原方法中 字符串也为 true NaN 的情况
var a = "str";
var b = 2;
var c = a/b;
function isNaN(n) {
if(typeof(n) === "number" && isNaN(n)) {
return true;
} else {
return false;
}
}
console.log(Number.isNaN(a)); // false
console.log(Number.isNaN(b)); // false
console.log(Number.isNaN(c)); // true
var a = "str";
var b = 2;
var c = a/b;
console.log(isNaN(a)); // true
console.log(isNaN(b)); // false
console.log(isNaN(c)); // true
// 不过可以用此来判断用户输入的是否为数值类型的数据
//它是判断一个值是不是NaN,如果是则返回true。但是a是一个字符串,用isNaN判断这个变量a的时候还是会返回true。
var tmp = 0/0;
if(isNaN(tmp)){
alert("NaN");
}
说明:如果把 NaN 与任何值(包括其自身)相比得到的结果均是 false,所以要判断某个值是否是 NaN,不能使用 == 或 === 运算符。
提示:isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的情况。
强制数据类型转换
String 的数据转换类型
1、toString()
- 调用转换数据类型的toString()方法,不影响原变量,将转换值返回
- 但是,null和undefined 这两个值没有toString()方法,不能使用
2、String()
- 调用String()函数,并将被转换的数据作为参数传递给函数
- 对于Number和Boolean 实际上就上就是调用toString()方法
- 但是对于null和Undefined 就不会调用toSting()方法
- 会将null直接转换为"null"
- undefined 直接转换为" undefined"
Number的数据转换类型
1、Number()
- 纯数字字符串,直接转换为数字
- 字符串有非数字的,则转换为NaN
- 字符串只有一个空格,或全是空格的字符串,则转换为0
- null --- 0 undefined -- NaN (Not a Number)
2、parseInt() 、parseFloat()
- parseInt()可以把一个字符串中有效的整数取出来转换为Number
- parseFloat()可以获得有效的小数点的Number
Boolean的数据转换类型
1、Boolean()
- 数字 --- > 转布尔值
- 除了0 和NaN,其余都是true
- 字符串 ---> 布尔值
- 除了空串,其余都是true
- null 和 undefined 都会转换为false
- 对象也会转换为true
算数运算符
当对非Number类型进行运算时,会将这些值转换为Number然后再运算
任何值和NaN做运算都会得NaN
+(加号) -(减号)
- 如果两个字符串相加则会拼在一起并返回
- 任何的值和字符串加法运算,都会先转换为字符串,然后再和字符串做拼串的操作
- 可以使用+number来将函数转换为number 的形式
逻辑运算符
1、 ! 非
- 非运算既是对一个布尔值进行取反(true 变false)
- 如果对一个值取两次反则不会发生变化
2、 && 与
- 两个值中有一个false 就 false
- 只有两个true 才返回true
- 如果第一个值为false 则不会看第二个值
3、 || 或
- 两个值中有一个true 就 true
- 两个值都为false 才 返回false
- 如果第一个值为true 则 不会检查第二值
4、 && 跟 || 的非布尔值的情况
- 对于非布尔值进行的与和非运算
- 会将其转换为布尔值,然后再运算,并返回原值
- && 与运算
- 如果第一个为true,则必然返回第二个值 sum = 2 && 1;
- 如果第一个为false,则直接返回第一个值
- || 或运算
- 如果第一个值为true,则直接返回第一个值
- 如果第一个值为false,则返回第二个值 sum = obj || ' obj is false '
相等运行算符
- === 全等 不全等!= =
- 不会自动的类型转换如果两个值不同,直接返回false
- == 相等 不相等 ! =
- 会自动进行类型转换,如果转换后相同则会返回false
- 1 == "1"例子
条件运算符(三元运算符)
- 语法
- 条件表达式? 语句1:语句2;
- 先对条件表达式进行求值
- 如果该值为true,则执行语句1,并返回结果
- 如果该值为false,则执行语句2,并返回结果
- a > b? alert("a") : alert("b") ;
代码块
- 在JS中可以使用{ }来进行分组
- 在代码块的后边可以不用在编写;了
- JS中的代码块只有分组的作用,没有其他用途
- 代码块内容的内容,在外部是完全可见的
- () => ( { 等于返回一个对象类型 } )
- 不然直接用{ }会被解析为代码块
if 语句
1、 语法一 if (条件表达式)
- 语句
- if语句只能控制身后紧随的那一个语句
2、 语法二 if。。。else。。
-
if(条件表达式){
语句
}else{ 语句 }
-
if(条件表达式){ 语句 }
-
else if (条件表达式) { 语句 }
-
else{ 语句 }
3、 prompt 提示框
- 会弹出一个提示框,可以输入一段内容,并以字符串形式返回
switch 条件分支语句
switch(条件表达式){
case 表达式: 语句 ; break;
default: 语句 ; break;
}
- swtich 会将传入的参数对case 的值进行一个全等比较
while 循环
-
while (条件表达式){ 语句 }
-
使用步骤
-
1、创建一个初始变量 var i = 1;
-
2、设置一个条件表达式 while( i <= 500){
3、 定义一个更新表达式
i++; }
-
-
do { } while();先 表达了再判断
for 循环
- 语句for(初始变量;条件表达式;更新表达式){ }
- for循环的三个循环可以都省略,也可以写在外面
- 如果都省略则会变成一个死循环
break; 跟continue;
- break可以终止循环,在嵌套里会终止最近的一个循环
- 也可以是用label标签来终止指定的循环
- 写法
- 定一个名字(name):
- 循环 (){ }
- break name;
- continue 结束本次循环 ,然后进行下一次循环
计时器
- console. time(“计时器的名字”)可以开启一个计时器
- 结束console. timeEnd(“计时器的名字”)可以终止一个计时器
计时器可以测试代码的运行效率
变量的声明提前
- 使用var 关键字 声明的变量,会在所有的代码执行前被声明(但不会赋值)
- 使用声明形式创建的函数function(){}
- 它会在所有代码执行之前就被创建
- 使用函数表达式创建的函数,不会被声明提前,使用不能在声明前调用
- var fun2 = function(){}这中不会被提前
作用域
1、全局作用域
- 直接编写在script标签中的JS代码,都在全局作用域
- 在全局作用域中,
- 创建的变量都会作为window对象的属性保存
- 创建的函数都会作为window对象的方法保存
- 在页面的任意部分都可以访问的到
2、函数作用域
-
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
-
每调用一次函数就会创建一个新的函数作用域,他们之间时互相独立的
-
函数作用域可以访问到全局作用域的变量
- 在全局作用域中无法访问到函数作用域的变量
-
在函数作用域操作一个变量时,现在自身作用域中找,有就直接用
-
如果没有则向上一级作用域中寻找,直到找到全局作用域
-
如果全局作用域中也没有,则会报错ReferenceError
-