网站前端_JavaScript.0012.JavaScript深入对象

基本类型:

说明: 基本类型变量主要在栈内存中保存变量名+变量值,变量赋值时解析器如果认定此值为基本类型,则分配固定大小的空间,基本类型包括Undefined, Null, Boolean, Number, String的字面值对象,称为基本类型对象


var name = ‘李满满‘
// 在栈内存中复制一份"李满满"给newName
var newName = name
newName = ‘刘珍珍‘
// 由于赋值的副本和原来的数据没半毛钱关系,所以任何一个基本类型的变量都不会改变其它变量的值
console.log(name, newName)


引用类型:

说明: 引用类型变量由于内存大小不固定,但是内存地址固定,所以将变量名+数据所在堆内存地址保存在栈内存中,变量值保存在堆内存中,当查询引用类型变量时,先从栈中读取内存地址,然后通过地址找到堆内存中的值,引用类型包括Boolean, Number, String, Function, Array, Object, Date, RegExp, Error, Map, Set对象和[]/{}生成的数组与对象等,称为引用类型对象


var userInfo = {
    name: ‘李满满‘
}
// 在栈内存中复制一份userInfo的内存地址给newUserInfo,此时userInfo和newUserInfo的内存地址相同
var newUserInfo = userInfo
newUserInfo.name = ‘刘珍珍‘
// 由于userInfo和newUserInfo的内存地址相同,所以指向的堆内存中的地址也相同所以修改任意一个引用类型的变量引起堆内存中数据改变,其它指向该堆内存的变量的都会改变
console.log(userInfo.name, newUserInfo.name)


传递参数:

说明: Js中所有函数的参数都是按值传递,传递引用参数和引用传参不是一个概念,函数支持传递基本参数和引用参数,但是参数不会按引用传递,如果是引用传递,则函数里的变量将会是全局变量,在外部可以访问


// 函数 - 按值传递,不可修改
function numAdd(num){
    num++
    return num
}
var num = 10
// 由num按值传递,num++是复制num的值然后+1,原来的num不受任何影响
console.log(num, numAdd(num), num)
// 函数 - 按值传递,可以修改
function userEdit(userInfo){
    userInfo.name = ‘刘珍珍‘
    return userInfo
}
var userInfo = {name: ‘李满满‘}
// 由于userInfo对象按值传递,userInfo.name=‘李满满‘是复制userInfo的堆地址,所以对同一个堆地址对应的堆数据修改另一个对应此堆地址的引用变量也会被改变
console.log(userInfo.name, userEdit(userInfo), userInfo.name)


检测类型:

说明: 检测基本类型对象可用typeof表达式,此表达式会打印对应类型对象的类型字符串表示,但是引用类型对象如果使用typeof检测基本返回的都是object,而我们更希望知道引用类型对象的原始类型,可使用instanceof表达式来判断


var strOrgObj = ‘python‘
var strRefObj = new String(‘python‘)
// strOrgObj为原始字符串类型对象存在在栈内存, strRefObj为引用类型对象(引用子原始字符串类型对象),存储在堆内存
console.log(typeof strOrgObj, typeof strRefObj, strRefObj instanceof String)


注意: instanceof只支持引用类型对象类型检测,对于检查基本类型的值时,会返回false

作用环境:

说明: 执行环境定义了变量或函数有权访问的其它数据,每个执行环境都关联一个对象,全局执行环境被认为是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建,而局部变量也有一个类似window的变量对象,环境中定义的变量和函数都保存在这个对象中



// 全局作用域 - 全局作用域默认与之关联的是window对象
var userName = ‘李满满‘
console.log(window.userName)
// 局部作用域 - 局部作用域默认与之关联的是最近的父类对象
function sort(arr){
    // 只能在sort函数内调用cmp方法,在外部无法调用
    function cmp(a, b){
        a = parseInt(a)
        b = parseInt(b)
        return a>b?1:(a==b?0:-1)
    }
    return arr.sort(cmp)
}
console.log(sort([1, 11, 2, 22, 3, 33]))

说明:  每个函数在调用时都会创建自己的执行环境,当执行到这个函数时,函数的环境就会被推到环境栈中去执行,然后执行后又在栈中弹出,把控制权交给上一级的执行环境,而且在函数被调用的时候会自动创建如上图的作用域链,作用域中查询变量时由作用域前端开始查找,逐步向外查询,因此强烈不建议不使用var初始化变量,因为这种方法可能导致各种意外



注意: 当执行环境中所有代码执行完毕,该环境被销毁,保存在其中的所有变量和函数也随之销毁,如全局变量环境下,需要程序执行完毕或网页被关闭才会销毁

内存问题:

说明: JavaScript具有自动垃圾收集机制,但是垃圾回收机制是周期运行的,一般来说确保占用最小内存可以获得更好性能,那么优化内存的最佳方案就是一旦数据不再有用,就标记删除(设置为null)


var userInfo = {name: ‘李满满‘}
userInfo = null
console.log(userInfo)


本文出自 “ζ自动化运维开发之路ζ” 博客,请务必保留此出处http://xmdevops.blog.51cto.com/11144840/1851415

时间: 2024-10-14 06:55:47

网站前端_JavaScript.0012.JavaScript深入对象的相关文章

网站前端_JavaScript.0008.JavaScript对象数组

对象简介: 说明: 类/类型是一种数据结构,用于将数据和功能组织在一起,虽然Js是一种面向对象的语言,却不具备传统面向对象那样可以自定义类结构 对象相关: 说明: Object实例虽然不具备多少功能但对于应用程序中的存储和传输数据而言,确实是非常理想的选择 // 创建对象 //          - 第一种方式 var newObj = new Object() //          - 第二种方式 var newObj = new Object //          - 第三种方式 var

网站前端_JavaScript.0001.JavaScript简单概述

简单说明: 1. JavaScript问世之前表单数据验证都是通过服务端验证,又由于拨号上网年代服务器验证非常慢,JavaScript的横空出世完美解决了此问题,完美支持客户端表单验证 2. 经过多年发展,JavaScript从一个简单的输入验证成为一门强大的面向对象,解释型,事件驱动的程序设计语言,目前主要用来验证发往服务器的数据,增加Web互动,加强用户体验度等 历史回顾: 1. 1995年网景和SUN开发出JavaScript脚本语言,微软眼红随即开发出一个JavaScript的克隆版,叫

网站前端_JavaScript.0002.JavaScript快速使用

<script></script> 说明: 用于在html页面中插入js的主要方法 属性名称 属性说明 src 表示包含要执行代码的外部文件,常用来引用外部的js文件 type 表示代码使用的脚本语言的内容类型 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript快速使用</title> </hea

网站前端_JavaScript.0013.JavaScript包装类型

简单介绍: 说明: Js提供了三个特殊的引用类型:Boolean, Number, String,当作为基本类型对象赋值给变量时,后台会创建一个对应的基本包装类型的对象,从而能够调用一些方法来操作这些类型的数据 // 字面量创建 var content = 'i love you!' var subContent = content.substring(2) console.log(subContent) // new String创建 var content = new String('i l

网站前端_JavaScript.0005.JavaScript运算表达

一元运算符: 1.递增++递减-- var userAge = 25 console.log(     // 25 - 保持原样     userAge,     // 26 - 在原来的基础上加1并返回     ++userAge,     // 25 - 在原来的基础上减1并返回     --userAge,     // 25 - 先返回再在原来的基础上减一     userAge++,     // 26 - 线返回再在原来的基础上减一     userAge-- ) 2.前置后置区别

网站前端_JavaScript.0006.JavaScript流程控制

if语句: 说明: 对于if语句括号里的表达式,Js会自动调用Boolean()转型函数将这个表达式的结果转换为一个布尔值,如果为true就执行语句块里的代码段 var userScore = 100 // 第一种形式: 如果语句块只有一句,可省略{} if(userScore > 90) console.log("your score level is A.") // 第二种形式: 如果语句块只有多句,可包含{} if(userScore > 90){     conso

网站前端_JavaScript.0007.JavaScript函数相关

函数简介: 说明: 函数是定义一次但可以多次调用或执行任意多次的一段Js代码,函数有时会有参数,即函数被调用时指定了值的局部变量,函数常常使用这些参数来计算一个返回值. 函数声明: 说明: 函数可以封装任意多条语句,而且可以在任意地方,任意时候调用执行,函数声明用function关键字声明,后跟着一组参数以及函数体 // 无需传参的函数 function calcResult(){     console.log('只有函数被调用,我才会被执行!') } // 调用函数 - 无需传参 calcR

网站前端_JavaScript.0009.JavaScript日期时间

日期类型: 说明: Js提供了Date类型来处理时间和日期,Date类型内置一些列获取或设置日期时间信息的方法,日期类型初始化参数以时间戳保存 // 创建日期对象, 默认当前时间对象,支持初始化,但必须能够解析 var newDate = new Date() console.log(newDate) var newDate = new Date('8/30/2016') console.log(newDate) var newDate = new Date('August 30, 2016')

网站前端_JavaScript.0003.JavaScript语法变量

语法构成: 1. JavaScript中的一切(变量,函数名,操作符等)都是区分大小写的 2. JavaScript中的标识符(变量,函数,属性名称,函数参数名称),首字符必须为字母/下划线/美元符号$,其它字符可以为字母/数字/下划线 3. JavaScript中不能把关键字/保留字/true/false/null作为标识符 代码注释: 说明: JavaScript使用C风格的注释,包含单行注释(//)和多行注释(/**/) 变量相关: 1. JavaScript的变量是松散型(可用来保存任何