JS数据类型和堆栈+变量比较和值的复制+参数传递和类型检测

变量命名

变量名:字母 数字 下划线 美元符$

jquery:  $     $.each()   $ === jQuery

underscore( js的一个函数库)  :   _     _.each()

关键字 :  if   for

保留字 :  class

推荐有意义的命名:

buttonCancel   button_cancel   btnCancel



数据类型和堆栈

基本类型(可以修改) :  4  str   true  undefined  null

引用类型(不能修改) :  { }  [ ]

var score = 40;
score = 50;

上面属于覆盖,不属于修改

var str = "hello";
var newStr = str.replace("h", "");
document.write( str + "/" + newStr);

字符串操作返回新的字符串,原字符串没有改变

        var obj = {};
        console.log(obj);
        obj.name = "cyy";
        obj.age = 25;
        obj.name = "cyy2";
        delete obj.age;
        console.log(obj);

引用类型的属性可以添加,可以修改,可以删除

        var name = "cyy";
        name.age = 25;
        console.log(name.age);//undefined

基本类型不能添加属性

str.replace()

1->Number

"str"->String

不是基本类型有属性和方法,而是通过基本类型找到其包装对象,包装对象会把属性和方法借给该基本类型的变量



基本类型保存在栈内存中,按值访问(直接访问)

引用类型保存在堆内存中,但是地址保存在栈内存中,按引用访问(需要中转)



变量比较和值的赋值

        var obj1 = {
            age: 24,
            num: 1
        }
        var obj2 = {
            age: 24,
            num: 1
        }
        console.log(obj1 === obj2);//false

基本类型的比较就是值的比较,只要值相等即为相等

引用类型,实际上是开辟了各自的内存空间,虽然内容相等,但是并不是一个地址

只有当指向同一个引用的时候,才为相等

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var obj1 = {
            age: 24,
            num: 1
        }
        var obj2 = obj1;
        console.log(obj1 === obj2);//true
    </script>
</body>
</html>

此时obj2保存的是obj1的地址,因此相等

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var obj1 = {
            age: 24,
            num: 1
        }
        var obj2 = {
            age: 24,
            num: 1
        }
        function equelObj(a, b){
            for(var i in a){
                if(a[i] !== b[i]) return false;
            }
            return true;
        }
        console.log(equelObj(obj1, obj2));//true
    </script>
</body>
</html>

以上方式可以比较两个对象的内容是否相等

        function equelArr(a, b){
            if(a.length !== b.length) return false;
            for(var i=0; i<a.length;i++){
                if(a[i] !== b[i]) return false;
            }
            return true;
        }

以上方式比较两个数组的内容是否相等

var name1 = "cyy";
var name2 = name1;
console.log(name2);//cyy

name2 = "cyy2";
console.log(name1);//cyy

基本类型复制是值的复制,两个变量互不干涉

var obj1 = {
    name: "cyy",
    age: 24
}
var obj2 = obj1;
obj2.age++;
console.log(obj2.age);//25
console.log(obj1.age);//25

引用类型复制是地址的复制,二者指向同一个地址,一个改变另一个也会发生改变

var obj1 = {
    name: "cyy",
    age: 24
}
function copyObj(a){
    var newObj = {};
    for(var i in a){
        newObj[i] = a[i];
    }
    return newObj;
}
console.log(copyObj(obj1));

以上方法是复制一个对象的内容,但不是引用的同一个地址

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script>
var obj1 = {
    name: "cyy",
    age: 24,
    hobby: []
}
function copyObj(a){
    var newObj = {};
    for(var i in a){
        newObj[i] = a[i];
    }
    return newObj;
}
console.log(copyObj(obj1));
</script>
</body>
</html>

该方式属于浅拷贝,如果对象中某个属性本身是引用类型,则复制时又会该属性又会指向同一个地址,需要用到递归解决

jquery 中的 $.extend 既可以进行浅拷贝,又可以进行深拷贝



不使用新的变量,来对换两个变量的值

var a = 3;
var b = 4;
a = a + b; //a=7
b = a - b; //b=3
a = a - b; //a=3

一个很奇葩的规则:赋值才会改变引用的地址,但是添加与修改内容不会改变地址

var a=[4];
var b=a;//此时b与a指向同一个空间 a=[4]  b=[4]
a=[4,44];//此处a被重新赋值,指向了另一个空间;b仍旧指向原来的空间
console.log(a);//(2) [4, 44]
console.log(b);//[4]

a=b;//此时a又指向了b的空间 a=[4] b=[4]
b.push(44);
console.log(a);//(2) [4, 44]

参数传递和类型检测

function add(a,b){
    return a+b;
}
console.log(add(3,4));//7

a,b是形参,3,4是实参

function addName(obj){
    obj.name="cyy";
}
var me={};
addName(me);
console.log(me.name);//cyy

引用类型的参数传递(实质上也是值传递)

function addName(obj){
    obj.name="cyy";//me.name=cyy(值传递)
    obj={};//obj指向了一个新的地址,但是me依旧指向老的地址
    obj.name="cyy2";//对新的地址进行操作
}
var me={};
addName(me);
console.log(me.name);//cyy

以上证明:由于引用类型作为参数时,实质上也是值传递。因此当形参被指向新的地址时,并没有对实参进行操作,因为二者并不是指向同一个地址



typeof 检测数据类型,返回值都是字符串类型

数组和对象都是返回object

instanceof Array  判断是否是数组的实例

instanceof Object  判断是够是object的实例(数组也是Object的实例,所有东西都是object的实例)

console.log([] instanceof Array);//true
console.log({} instanceof Array);//false
console.log([] instanceof Object);//true
console.log({} instanceof Object);//true

不用第三个参数,对换两个引用类型的变量值

var a = {name: ‘xm‘}, b = [4];
a=[a,b];//[{name: ‘xm‘}, 4]
b=a[0];//b={name: ‘xm‘};
a=a[1];//a=[4]

null是Null类型,属于基本类型

console.log(typeof null);//object
console.log(null instanceof Object);//false

原文地址:https://www.cnblogs.com/chenyingying0/p/12293316.html

时间: 2024-11-05 15:56:05

JS数据类型和堆栈+变量比较和值的复制+参数传递和类型检测的相关文章

js数据类型,及内存存储学习笔记

一.Javascript的数据类型 (1)基本类型: undefined :指的是,使用var声明变量但未对其加以初始化, var meddling,对未初始化的变量执行typeof操作符会返回undefined,而对未声明的变量执行typeof操作符同样也会返回undefined null  :typeof操作符会返回object,只要保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值. Boolean:该类型有俩个字面值:true ,false 大小写区分 Number :

static 和 final 关键字 对实例变量赋初始值的影响

static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的这个问题的细节. 在2.3.1小节中讲对象创建的时候,讲到内存分配有两种方式:一种是指针碰撞:另一种是空闲列表. 而选择哪种分配方式是由JAVA堆是否规整决定,而JAVA堆是否规整则由虚拟机所采用的垃圾收集器是否带压缩整理功能决定. 我们不管内存分配采用何种方式,当内存分配完成后,虚拟机将分配到的内存空间都初

Js 基本数据类型,var 变量,数组

(一) Js 数据类型 分为基本数据类型以及引用类型 基本数据类型有 null,undefined,Boolen,Number,String,还有一种复杂数据类型 Object. var var1 = "xianrongbin", var2 = false, var3 = null, var4 = undefined, var5 = 123; console.log(typeof var4); var var6 = [1, 23, 5]; console.log(typeof var6

前端学习(25)~js学习(三):变量的数据类型

变量的数据类型 为什么需要数据类型 在计算机中,不同的数据所需占用的存储空间不同,为了充分利用存储空间,于是定义了不同的数据类型.而且,不同的数据类型,寓意也不同. JS 的变量数据类型,是在程序运行的过程中,根据等号右边的值来确定的.而且,变量的数据类型是可以变化的.比如说: var name = 'qianguyihao'; name = 123; // 强制将变量 name 修改为 数字类型 JS中一共有六种数据类型 基本数据类型(值类型):String 字符串.Number 数值.Boo

JavaScript学习笔记——js变量的布尔值

typeof(1): numbertypeof(NaN): numbertypeof(Number.MIN_VALUE): numbertypeof(Infinity): numbertypeof("123"): stringtypeof(true): booleantypeof(window): objecttypeof(Array()): objecttypeof(function(){}): functiontypeof(document): objecttypeof(null)

js数据类型简单介绍

JS数据类型 ECMAScript中有5种简单的数据类型:Undefined,Null,Boolean,Number,String.还有一种复杂的数据类型--Object(本质上是由一组无序的名值对组成的). typeof操作符--用于检测给定变量的数据类型 "undefined"-未定义 "boolean"-布尔值 "string"-字符串 "number"-数值 "object"-对象或者null &q

JS数据类型

一.Javascript中的数据类型可以分为基本数据类型和复合数据类型两种: (1)基础数据类型有5种数据类型:Number.Boolean.Undefined.Null和String.       Number类型:整数和浮点数.NaN:Not a Number.这个数值用于本来要返回一个数值,但是却未能放回一个数值的情况,以防止报错. 例如:1/0 返回的就是NaN.NaN的特点:1.任何涉及NaN的操作都会返回NaN.2.NaN对任何值都不相等,包括自己NaN本身. 针对NaN特性,JS内

浅谈JS数据类型存储问题

背景 一个经典的问题,先抛出来给大伙看看: var a = "黑MAO"; var b = a; var c = new Object(); var d = c; a = "新黑MAO"; c.age = 24; //打印出结果是怎么样的呢? console.log(a, b, c, d); 上面先把问题出来,经过本文的梳理,之后再回头看看这个过程. JS有哪些数据类型? JS包含量大数据类型,一种是基本数据类型(String.Number.Boolean.unde

JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

“JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是将一组需求分解成一组函数与数据结构的技能. 1.函数的功能 代码重复性使用 模块化编程 2.语法: 使用函数前要先定义才能使用 函数定义有三个部分:函数名,参数列表,函数体 格式: 1 function 函数名([参数1, 参数2, ...]){ 2 3 函数执行部分; 4 5 return 表达式; 6 7