美文网首页
js变量的类型和计算

js变量的类型和计算

作者: 小菜鸟dreamy | 来源:发表于2020-01-06 17:09 被阅读0次

js变量类型:值类型和引用类型
值类型number,string,boolean,undefined,symbol

var a = 100
var b = a
a = 200
console.log(b)

引用类型object,function

var a = {age:20}
var b = a
b.age = 21
console.log(a.age)

其中,值类型直接保存在栈内存中,值都有固定的大小,保存在栈空间,通过按值访问。引用类型保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象。(为什么引用类型这样存储呢?因为引用类型的值会有很多属性,值太大的话放到栈中不好管理,直接复制值的话,会导致复制过程太慢。)这种机制是基于内存空间和CPU计算的耗时来区分的。

因为存储方式不同,所以有了深拷贝浅拷贝的问题

如果是值类型,数据发生复制行为时,系统会自动给新的变量开辟一个新的空间,赋一个新的值,这些变量都相互独立,相互不影响

let a = 20;
let b = a;
b = 30;
console.log(a); // 20

如果是引用类型,数据发生复制行为时,同样会开辟一个新的空间,赋一个新的值,但这个所赋的值,是一个地址指针,这个复制的指针和被复制的指针指向同一个值

let a = { x: 10, y: 20 }
let b = a;
b.x = 5;
console.log(a.x); // 5

这种情况下,怎么办呢?如何实现深拷贝呢?
方法一:(反序列化)使用JSON.parse()和JSON.stringify()对对象进行深拷贝 (真正的进行对象的深拷贝),该方法会忽略function和undefined的字段,对date类型支持貌似也不友好。而且只能克隆原始对象自身的值,不能克隆它继承的值
方法二:es6的扩展运算符...

var a = ['a', 'b', 'c'];
var b = [...a];
b.push(2)
console.log(b) //["a", "b", "c", 2]
console.log(a) //["a", "b", "c"]

let obj = {
    name:'huahua',
    sex:'girl'
}
let obj1= {...obj}  //或者  let {...obj1}= obj
obj1.name="qq"
console.log(obj1) //{name: "huahua", sex: "girl"}
console.log(obj) //{name: "qq", sex: "girl"}

方法三:递归

function deepClone (obj={}) {
  // 判断传入的obj不为空并且是object类型
  if (obj == null || typeof obj !== "object")   return
  let res
  if (obj instanceof Array){
    res=[]
  } else {
    res={}
  }
  for (let key in obj) {
    // hasOwnProperty确保key是自身的属性而不是原型上的属性
    if (obj.hasOwnProperty(key)) {
      res[key] = deepClone (obj[key])
    }
  }
  return res
}

实现数组深拷贝:
1.slice

var a = ['a', 'b', 'c'];
var b = a.slice(0);
b.push(2)
console.log(b) //["a", "b", "c", 2]
console.log(a) //["a", "b", "c"]

2.concat

var a = ['a', 'b', 'c'];
var b = a.concat();
b.push(2)
console.log(b) //["a", "b", "c", 2]
console.log(a) //["a", "b", "c"]

所有的引用类型都可以自由的设置属性

var obj = {}
obj.a = 100

var arr = [1,2,3]
arr.a = 100   //(3) [1, 2, 3, a: 100]

function fn() {}
fn.a = 100

typeof可以判断这些类型,如下

console.log(typeof 123);  // =>number

console.log(typeof "abc");  // =>string

console.log(typeof true);  // =>boolean

console.log(typeof undefined); // =>undefined

console.log(typeof Symbol()); // =>symbol

console.log(typeof {});  // =>object

console.log(typeof []);  // =>object

console.log(typeof null);  // =>object 因为 null 也是引用类型

console.log(typeof console.log);  // =>function

值类型的判断用typeof ,引用类型的判断用instanceof

js中常见内置函数:

Object Array Boolean Number String Function Date RegExp Error

那么,JSON又是什么呢?
其实,JSON是一种数据格式。从js角度来回答的话,JSON是一个对象,有parsestringify两个方法

JSON.stringify({a:10, b:20})  //"{"a":10,"b":20}"
JSON.parse('{"a":10,"b":20}')  //{a: 10, b: 20}

变量计算
简单的变量计算,就是数字的加减乘除、字符串的拼接和替换,这个太简单了,这里不提了。但是 JS 在值类型的运算过程中,特别需要注意和利用强制类型转换这一特性,有以下场景:

  • 字符串拼接
  • ==
  • 逻辑运算(if ! || &&
var a = 100 + 10   // 110
var b = 100 + '10' // '10010'

100 == '100'   // true
0 == ''  // true
null == undefined  // true

console.log(10 && 0)  // 0
console.log('' || 'abc')  // 'abc'
console.log(!window.abc)  // true

// 判断一个变量会被当做 true 还是 false
var a = 100
console.log(!!a)
何时使用=== 何时使用==

首先,==会先试图类型转换,然后再比较,而===不会类型转换,直接比较。如下所示:

1 == '1' // true
1 === '1' // false
0 == false // true
0 === false // false
null == undefined // true
null === undefined // false

日常开发中,以下变量会被转换为false

  • 0
  • NaN
  • ''
  • null
  • undefined
  • false 本身

除了以上几个,其他的都会被转换为true除了if之外,! || &&这三个运算符也会进行同样的转换,跟if是一个道理
日常开发中,都使用===,有一种情况用==,就是判断是否存在的时候

if (obj.a == null) { 
 // 这里相当于 obj.a === null || obj.a === undefined ,简写形式
}

相关文章

  • JS基础

    JavaScript 面试 JS基础篇 变量类型和计算 JS中使用typeof能得到哪些类型-undefinded...

  • JS变量类型和计算

    变量类型 1.值类型 (赋值之间不会相互影响) 2.引用类型 :对象,数组,函数 (赋值是变量指针,不是真正的...

  • js的变量类型和计算

    变量类型 按照存贮方式来分,变量类型分为值类型和引用类型 1.JavaScript中的变量类型有哪些? (1)值类...

  • js变量的类型和计算

    js变量类型:值类型和引用类型值类型:number,string,boolean,undefined,symbol...

  • 第二章 js基础知识上

    2-1 变量类型和计算 题目 JS 中使用 typeof 能得到的哪些类型 何时使用 === 何时使用 == JS...

  • JS基础知识体系

    JS基础知识 1、变量类型和计算 值类型和引用类型 类型判断 逻辑运算 2、原型和原型链 class 继承 原型 ...

  • JavaScript散乱(一)

    变量和计算 js中使用typeof能得到哪些类型? 强制类型转换 可能引起强制类型转换的操作 字符串拼接 ==运算...

  • 5-1 从基础知识到JSWebAPI

    回顾js基础知识 JS-web-API 总结 回顾js基础知识 变量类型和计算 原型和原型链 闭包与作用域 异步和...

  • JS变量类型,存储方式以及特点

    1.JS变量类型 JS变量类型分为基本类型和引用类型 基本类型:基本类型有Undefined,String,Num...

  • 前端JS面试技巧-第二章JS基础

    2-1变量类型和计算 题目 知识点 解答 题目 JS中使用typeof能得到那些类型 何时使用 === 何时使用 ...

网友评论

      本文标题:js变量的类型和计算

      本文链接:https://www.haomeiwen.com/subject/lqbkactx.html