javascript(JS) 0基础快速入门 (一)(快速了解八种数据类型)

176 阅读10分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

标识符

1.在JS中所有可以有我们自主命名的都可以称为是标识符。
2、例如:变量名、函数名,属性名都属于标识符
  • 命名有一个标识符的规则

    1.标识符可以含有字母、数字、_、$

    2.可以使用 Unicode 转义序列。例如,字符 a 可以使用“\u0061”表示。

    3.标识符不能是ES中的关键字(break、for。。)或保留字(class、import、public。。)

    1. 标识符一般都采用驼峰命名法
      • 首字母小写,每个单词开头字母大写,其余字母小写
      • 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  表达式:   语句    ;  breakdefault:   语句   ;  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