变量 数据类型

184 阅读3分钟

一.JS变量

  • 1.变量是程序在内存中申请的一块用来存放数据的空间

var age; 声明一个 名称为age 的变量

age = 10; // 给 age 这个变量赋值为 10

同时声明多个变量 (var age = 10, name = 'zs', sex = 2; )

  • var age ; console.log (age); | 只声明 不赋值 | undefined

  • console.log(age) | 不声明 不赋值 直接使用 | 报错

  • age = 10; console.log (age); | 不声明 只赋值 | 10

  • **2.数据类型 **

  • 简单数据类型 (Number,String,Boolean,Undefined,Null)

  • 复杂数据类型 (object)

  • NaN ,Not a number,代表一个非数值

2 获取检测变量的数据类型

2.1 typeof

typeof "";  //string
typeof 1;   //number
typeof false; //boolean
typeof undefined; //undefined
typeof function(){}; //function
typeof Symbol(); //symbol
typeof null; //object
typeof {}; //object
typeof []; //object
typeof new Date(); //object
typeof new RegExp(); //object

2.2 instanceof

{} instanceof Object; //true
[] instanceof Array;  //true
[] instanceof Object; //true
"123" instanceof String; //false
new String(123) instanceof String; //true

2.3 Object.prototype.toString() (这种最准确)

上面不能区分 Object Array
var gettype=Object.prototype.toString
gettype.call('aaaa') 输出 [object String] 
gettype.call(2222) 输出 [object Number] 
gettype.call(true) 输出 [object Boolean] 
gettype.call(undefined) 输出 [object Undefined] 
gettype.call(null) 输出 [object Null] 
gettype.call({}) 输出 [object Object] 
gettype.call([]) 输出 [object Array] 
gettype.call(function(){}) 输出 [object Function]

2.4 封装一个准确判断数据类型的函数

function getType(obj){
  let type  = typeof obj;
  if(type != "object"){
    return type;
  }
  return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
}
  • 转换为数字型(重点)parseInt() parseFloat()
1.使用let关键字声明的变量具有块级作用域 ({}就是一个块)
2.防止循环变量变成全局变量
3.使用let声明的变量没有变量提升;具有暂时性死区特性
/* -------1.在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
      if (true) {
      	let num = 100;
      	var abc = 200;
      }
      console.log(abc) //200
      console.log(num) // ReferenceError: num is not defined
/* -------2.防止循环变量变成全局变量--------- */
	  let arr = [];
      for (let i = 0; i < 2; i++) {
         arr[i] = function() {
            console.log(i);
         }
      }
      // console.log(i);  // 这里拿不到i 
      // for循环是同步执行的   但是arr里面保存的函数是独立的作用域
      // 打印i的时候 函数内没有  回去上级查找  上级作用域不是全局作用域  而是let产生的块级作用域
      arr[0](); // 0
      arr[1](); // 1
      // 此题的关键点在于每次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,
      // 函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的i值.
      // =============================================================
      // for循环是同步的  只要index = 2的时候才会跳出for循环  此时index是全局作用域 等于2
      let arr2 = []
      for (var index = 0; index < 2; index++) {
         arr2[index] = function() {
            console.log(index);
         }
      }
      console.dir(arr2);
      console.log(index); // 2
      console.log(arr2[0]);
      arr2[0]() // 2
      arr2[1]() // 2
         /* 分析 当index等于0和1 的时候 执行循环  结果是向arr2中添加item  item是函数  但是函数并没有执行
         因为循环还没结束呢
         当index=2的时候 循环结束了 开始执行函数  函数的内容是输出index   此时index是全局变量 index=2 
         打印也可以发现 
         arr2[0] = ƒ () {
            console.log(index);
         }   输出的是index   二此时index=2
          */
/* -------3.使用let声明的变量没有变量提升;具有暂时性死区特性 --------- */
	  if (true) {
         console.log(num); // 报错 ReferenceError: num is not defined (证明不存在变量提升)
         let num = 20;
      }
/*  const 1.具备let的性质 2. 声明的常量必须有初始值  */
      //  简单数据类型 一但是赋值不可更改
      //  复杂数据类型  arr  obj 不能重新赋值(这样改变了内存地址 ) 但是可以增删里面的属性
      //  const 不可更改的是内存地址(重点)
      // const PI = 3.14;
      // PI = 100; 报错
      // const ary = [100, 200];
      // ary[0] = 123;
      // ary = [1, 2] 报错
      // ary.push(300)
      // console.log(ary);