首页 > 其他分享 >JS变量的类型和计算

JS变量的类型和计算

时间:2023-08-28 22:22:44浏览次数:34  
标签:obj 变量 JS typeof 类型 const 100 null true

变量类型和计算 - 知识点


变量类型

值类型和引用类型

// 值类型
let a = 100
let b = a
a = 200
console.log(b) // 100
// 引用类型
let a = { age: 20 }
let b = a
b.age = 21
console.log(a.age) // 21

(画图解释其中的玄机 —— 用一个 excel 表格即可表示)

常见值类型

const a // undefined
const s = 'abc'
const n = 100
const b = true
const s = Symbol('s')

常见引用类型

const obj = { x: 100 }
const arr = ['a', 'b', 'c']
const n = null // 特殊引用类型,指针指向为空地址
function fn() {} // 特殊引用类型,但不用于存储数据,所以没有“拷贝、复制函数”这一说

类型判断

typeof 作用

  • 能判断所有值类型
  • 能判断函数
  • 能识别引用类型,仅此而已
// 判断所有值类型
let a
console.log(a) // 'undefined'
const str = 'abc'
typeof str  // 'string'
const n = 100
typeof n // 'number'
const b = true
typeof b // 'boolean'
const s = Symbol('s')
typeof s // 'symbol'
// 能判断函数
typeof console.log // 'function'
typeof function () {} // 'function'

// 能识别引用类型(不能再继续识别)
typeof null // 'object'
typeof ['a', 'b'] // 'object'
typeof { x: 100 } // 'object'

变量计算

变量计算一本用于值类型,引用类型会通过 API 来修改数据。

  • 数字 加减乘除
  • 字符串 拼接
  • 逻辑运算 && || ! == if-else

这其中,会隐含比较大的坑 —— 强制类型转换

字符串拼接( + 号)

const a = 100 + 10   // 110
const b = 100 + '10' // '10010'
const c = true + '10' // 'true10'

== 和 ===

// == 会尝试强制类型转换
100 == '100'   // true
0 == ''  // true
0 == false // true
false == '' // true
null == undefined  // true

总之,== 会尝试进行强制类型转换,至于转换的规则大家没必要,只需要记住一点

  • 所有的地方都用 ===
  • 除了判断是 null 或者 undefined 时用 if (obj.a == null) —— 这也是 jQuery 源码中的方式
const obj = { x: 100 }
if (obj.a == null) { }
// 相当于:
if (obj.a === null || obj.a === undefined) { }

逻辑运算

首先认识一个概念

  • falsely 变量,即 !!a === false
  • truely 变量,即 !!a === true

falsely 变量有如下,(其余的就是 truely 变量)

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

所有的逻辑运算中,都会用这个规则去判断 true 或者 false

// truely 变量
const a = true
if (a) {
    // ....
}
const b = 100
if (b) {
    // ....
}

// falsely 变量
const c = ''
if (c) {
    // ....
}
const d = null
if (d) {
    // ...
}
let e
if (e) {
    // ...
}
// 逻辑运算的示例
console.log(10 && 0)  // 0
console.log('' || 'abc')  // 'abc'
console.log(!window.abc)  // true

深拷贝

依赖于类型判断,所有最后讲

// 深拷贝
function deepClone(obj = {}) {
    if (typeof obj !== 'object' || obj == null ) {
        // 不是对象或者数组形式,或是 null ,直接返回
        return obj
    }

    // 初始化返回结果
    let result
    if (obj instanceof Array) {
        result = []
    } else {
        result = {}
    }

    // 变量
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            // 保证不是原型属性(原型和原型链部分会讲解)

            // 递归调用
            result[key] = deepClone(obj[key])
        }
    }

    // 返回结果
    return result
}

const obj1 = { x: 100, y: 200 }
const obj2 = deepClone(obj1)
obj1.x = 101
console.log(obj2) // x: 100

为何计算机不默认把引用类型赋值作为深拷贝?

  • 耗费性能
  • 占用空间

JS中使用typeof能得到的哪些类型

针对这个题目,可以通过以下程序进行验证

typeof undefined // 'undefined'
typeof 'abc' // 'string'
typeof 123 // 'number'
typeof true // 'boolean'
typeof Symbol('s') // 'symbol'
typeof {}  // 'object'
typeof [] // 'object'
typeof null // 'object'
typeof console.log // 'function'

何时使用=== 何时使用==

  • 所有的地方都用 ===
  • 除了判断是 null 或者 undefined 时用 if (obj.a == null) —— 这也是 jQuery 源码中的方式
const obj = { x: 100 }
if (obj.a == null) { }
// 相当于:
if (obj.a === null || obj.a === undefined) { }

值类型和引用类型的区别

// 值类型和引用类型的区别
const obj1 = { x: 100, y: 200 }
const obj2 = obj1
let x1 = obj1.x
obj2.x = 101
x1 = 102
console.log(obj1) // { x: 101, y: 200 }

标签:obj,变量,JS,typeof,类型,const,100,null,true
From: https://www.cnblogs.com/bfyzzk/p/17663524.html

相关文章

  • JS手写代码实现深拷贝
    /***深拷贝*/constobj1={age:20,name:'xxx',address:{city:'beijing'},arr:['a','b','c']}constobj2=obj1obj2.address.city='shanghai'console.log(o......
  • 【转载】如何解决 nginx proxy_pass 使用变量 $arg 404 ?
    为什么location/auth0/{proxy_passhttps://cdn.eu.auth0.com/;}这样就可以但是location/auth0/{proxy_passhttps://$arg_host/;}就404$arg_host===cdn.eu.auth0.com  proxy_pass是用了变量的话,nginx就不会自动添加path到host后面例如......
  • 3.2.1 报表类型简介
    一、报表类型简介1.报表分类1.1普通报表使用最多的设计模型,保存为cpt类型分为报表设计、参数设计、图表设计和填报设计四个部分在分页预览模式下不能在报表主体中展示控件单元格间相互影响,很难保持独立性。普通模板设计是单元格设计模型,通过单元格扩展,单元格之间的父子......
  • Day10_集合类型
    1.集合类型_关系运算: 2.集合类型_定义: 3.字典和集合的定义: 4.集合类型_类型转换: 5.交集_合集_差集: 6.对称差集_父子集: 7.集合去重: 8.其他内置方法: ......
  • 【NestJS系列】核心概念:Middleware中间件
    前言用过express与koa的同学,对中间件这个概念应该非常熟悉了,中间件可以拿到Request、Response对象和next函数.一般来讲中间件有以下作用:执行任何代码对请求与响应拦截并改造结束request-response周期通过next()调用下一个中间件如果当前中间件没有结束当前request-respons......
  • UE4.27, Debug issues, "变量已被优化掉,因而不可用"
    调试时添加监控后,变量未被成功监控,显示"变量已被优化掉,因而不可用" 所使用的解决办法从解决方案配置的下拉菜单中选择DebugGameEditor  感谢阅读,敬请斧正......
  • chatGPT的js信号量实现
    信号量类在JavaScript中,可以使用Promise和async/await来模拟信号量,下面是一个简单的信号量实现:classSemaphore{constructor(maxConcurrency){this.maxConcurrency=maxConcurrency;this.currentConcurrency=0;this.queue=[];}asyncacqu......
  • AWK - 内置变量
    内置变量内置变量使用说明NF获取文件的每行字段数,默认按照空格区分字段。NR获取文件行数,空白行对应行号默认不显示。FNR读取单个文件,效果同NR。读取多个文件,当读到新文件,FNR方式获取的行号重新从1开始,NR延续上个文件的行号。FS输入字段分隔符,默认是空格。......
  • 基于JS实现回到页面顶部的五种写法(从实现到增强)
    这篇文章主要介绍了基于JS实现回到页面顶部的五种写法(从实现到增强)的相关资料,本文介绍的非常详细,实用性也非常高,非常具有参考借鉴价值,需要的朋友可以参考下 写法【1】锚点使用锚点链接是一种简单的返回顶部的功能实现。该实现主要在页面顶部放置一个指定名称的锚......
  • Newtonsoft.Json:JObject 动态添加字段/List<JObject>转DataTable
    1.JObject动态添加字段;varjsonObject=newJObject();foreach(varkeyinKeys){jsonObject.Add(key,value);}jsonObject.Add("*****","1");2. List<JObject>转DataTable1): 首先List<JObject>转stringList<JObject>jso......