上篇文章讲了js中的一些概念(词法结构) 和 数据类型(部分)。 这章我们 继续.然后了解下js中操作数据 和 函数的 作用域。
1,对象跟基本类型之间的转换:
不管何时,只是对象非空,在布尔环境中都为true.
如;
new Boolean(false);
new Number(0);
new String(“”);
new Array();
上面虽然内部值是false,但对象的值是true;
Object ? valueOf() ? toString()
其中Date类,是先执行toString()转换。
2,js中操作一个数据值:
任何语言都有自己的操作数据的方法;
Js也不例外,js有3种重要的方式来操作一个数据值。
1) 复制它。例如把它赋给一个新的变量。
2) 把它作为参数传递给一个函数或方法。
3) 可以和其他值比较大小。
Js通过传值和传址2种方式操作这些数据的值。
从名称可以看处,传值 是通过传递值来操作数据。在赋值的过程中,对实际的值进行了拷贝,存储到一个新的变量中。拷贝的值和原来的值是2份完全独立的值。所以如果你改变了拷贝的值,并不会影响原来的值。当比较大小时候,通常进行琢个字节比较。
传址 从名字来看,就是通过传递地址来操作数据。在赋值的过程中,对实际的值的地址(可以说是引用)进行了拷贝,他们不是完全的独立,所以如果你通过引用改变了值,那么原始的值也会改变。当比较大小的时候,通常是看他们是否引用同一个地址来比较。
简单的传址例子:
var a = new Date();
alert(a.getDate());
var b = a ;
b.setDate(21);
alert(a.getDate()) // 输出21
3,一般来说:
基本数据类型通过传值来操作的。(如果忘记了哪些是基本数据类型,可以往回看。)
对象数据类型通过传址来操作的。(比如 数组和函数)
例子:
<script> <br>//传值 <br>a=1; <br>b=a; <br>b=2; <br>alert(a); //输出 1 <br><br>//传址 <br>x=[1,2]; <br>y=x; // 赋给y的只是x的一个引用,而不是x本身。数组已经在语句中被赋值了,执行过这段代码后,仍旧只有一个数组对象,只不过我们有2个对他的引用了。 <br>y[0]=2; <br>alert(x[0] +" | " +x[1]); //输出 2 | 2 <br></script>
其中我们必须注意字符串:
js中字符串是通过传址来复制和传递的,而他们是通过传值来比较的。
对象和数组是用传值来传递的,只不过传递的这个值实际是一个引用,而不是对象本身。
总结:
类型 复制 传递 比较
数字 传值 传值 传值
布尔 传值 传值 传值
字符串 不可变 不可变 传值
对象 传址 传址 传址
不可变:在JS中,没有方法去改变字符串值的内容。
对字符串来说,传值还是传址,意义不大。
4,垃圾收集机制:
Js中自动释放内存。
比如:
var s =”heelo”;
var b = s.toUpperCase();
s=b; //运行到这里后,js会自动检测不再使用某个对象,因为s=b了,所以js会自动释放字符串“heelo”所占的存储空间。即我们不能再获取原始的 “heelo” 值;.
5 , javascript变量:
Js是非类型的。它的变量可以放任何类型的值。
变量的声明:
var a ;
var b ;
或者
var a , b ;
或者
var a=0 , b=1 ;
重复声明 是合法的,
如果 遗漏声明 , js会隐式的声明该变量。当然隐式声明的变量总是全局变量。
6 , 变量的作用域:
Js有2种:全局和局部。
从名字的定义可以知道,全局变量的作用域是全局性的。
在js代码中,处处都有定义。
局部变量的作用域是局部的。
在函数体内定义。
同名的局部变量的优先级比同名的全局变量高,下面的例子说明了这点:
var a ="abc"; //全局变量
function check(){
var a = "efg"; //同名的局部变量
document.write(a);
}
check(); // 输出 efg
看一个比较经典的例子:
var scope = "global";
function f(){
alert(scope); //输出 undefined
var scope = "local";
alert(scope); //输出 local
}
f();
为什么第一个会输出undefined 呢?
因为js规定当 局部变量和全局变量的名称相同的时候,函数体内的同名全局变量会被隐藏。
那么刚才例子 实际 等价于:
function f(){
var scope;
alert(scope);
scope = "local";
alert(scope);
}
f();
OK,如果你看懂了这个例子,说明你对局部和全局的一些区别稍微了解了。
7 , 变量的作用域:
从里到外:
词法作用域 作用域链 变量查找
var x = 1;
function f(){
var y =2 ;
function g(){
var z =3 ;
}
} 调用g()对象; z =3 ;
调用f()对象; y =2 ;
全局变量 x = 1 在此定义了吗?
是
否
获得值
在此定义了吗?
是
否
获得值
在此定义了吗?
是
否
获得值
未定义
8 , 客户端全局变量:
在客户端js中,Window对象代表浏览器窗口,他是一个全局对象。、
比如 ;我们常用的 parseInt() , Math() 都是Window对象定义的属性。
Js允许多个全局变量的执行环境,每个环境有不同的全局对象。
比如:客户端js的每个独立的浏览器窗口,或者同一窗口的不同帧。
其中的代码都运行在自己的执行环境中,具有自己的全局对象。
当然可以使用 表达式 parent.frames[0].x ; 来引用第一个帧中的全局变量 x ;这样就把不同帧中的代码联系起来了。
不过这里有安全性问题。
总结;
主要讲了 传值和传址 和 函数的作用域 。
对新手来说稍微难理解些。如果还有不懂,可以google 搜索资料

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。