深入理解JS中的变量及作用域、undefined与null


Posted in Javascript onMarch 04, 2014

1、Javascript变量作用域

javascript中,变量主要分为局部变量和全局变量两种,对应的作用域也是局部作用域和全局作用域。

1 局部变量和作用域
局部变量一般在函数体内部声明使用:

function func(){
  var i=12;//局部变量
  ......
}

局部变量的作用域在声明这个变量的函数体范围内使用。
局部变量的声明周期从函数被调用执行开始初始化,在函数调用执行完毕之后被销毁。

2、全局变量和作用域

全局变量一般在函数体外面声明:

var i=12;//全局变量
function func(){
  ......
}

还有一种没有声明而直接使用的变量,默认为全局变量:

function func(){
  i=12;//没有被声明(使用var 关键字声明),默认为全局变量
}

全局变量在当前页面中所有的脚本和方法中都可以使用,作用域为当前页面脚本中。
全局变量的声明周期在变量被初始化时被创建,在当前页面关闭的时候被销毁。

2、typeof关键字

typeof关键字主要用来检测变量的数据类型,JavaScript中主要的数据类型有string、number、Boolean、object等

console.log(typeof 'str');//string
console.log(typeof 23);//number
console.log(typeof false);//boolean
console.log(typeof [1,3,12]);//object
console.log(typeof {name:'jack',age:12});//object
console.log(typeof new Date());//object

注意: js中的数组、json对象都是object数据类型的

3、null和undefined

null和undefined在JavaScript中经常出现,表示一个变量的值为空或者是一个变量未被定义。在表示值的时候,都可以表示为空值,但是在数据类型方面还是不一样。

console.log(typeof null);//object
var persion = null;
console.log(persion);//null

console.log(typeof undefined);//undefined
var persion2;
console.log(persion2);//undefined

null的数据类型为object,undefined的数据类型就是undefined。
变量声明,值为null,变量值为null;变量只声明,没有赋值,值为undefined。
再看一组对比:

console.log(null==undefined);//true 值相等
console.log(null===undefined);//false  类型不相等

这就可以看出来,null和undefined的表示值的时候,都表示空;null的数据类型为object,undefined的数据类型就是undefined。只声明而没有初始化的值都是undefined。

下面是补充

Situation One

<script>
var i; //全局变量

//方法名是camel命名法

//方法里面的变量是局部变量


function sayHello(){

var x=100;

alert(x);

x++;

}

sayHello(); //输出100

alert(x); //报错,因为x是局部变量,访问不到
</script>

Situation Two

<script>
function sayHello(){
var x=100;

if(x==100){


var y=x+1;


alert(y); //输出101

}

alert(y); //也输出101,在方法内部,不存在块级作用域,在C#中就不可以了!!!


for(var i=0;i<2;i++){


alert(i)

} //在for循环里面定义的变量是块级作用域

alert(i); //因为i是局部变量,所以输出2

}
sayHello();
</script>

注:变量使用前可以不用var声明,这样的变量会被认为是“全局变量”,但很少这样用

关于undefined与null

有以下几种情况的,变量的值为undefined
1、变量定义,但没有赋值,则变量的值为undefined
2、调用的方法没有返回值,在返回的值为undefined
3、对象的属性值不存在,则返回值为undefined,如:document.ddd

Example1:

var xx;
var yy=null;

if(xx==yy){

alert('相等');

}

else{


alert('不等');
}

输出结果为相等,因为在进行if判断时,浏览器会对xx及yy进行值的判断,因为两者都没有具体的值,认为他们都是false。
如果if判断中换成===[全等于符号],则输出不等!因为===表示要求xx及yy的数据类型和值都要相同才可以!
 
Example2:

var xx=10
var yy='10';

if(xx==yy){

alert('相等');
}

else{


alert('不等');
}

输出相等,如果换成===,则输出不等

Example3:

var n='10';
switch(n){
case 10:



alert('数字');

break;


case '10':



alert('字符串');

break;
}

输出 字符串
switch中的判断要考虑类型

总结:if中的判断是判断数值,不考虑类型

Javascript 相关文章推荐
jQuery对象和Javascript对象之间转换的实例代码
Mar 20 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
Jquery实现控件的隐藏和显示实例
Feb 08 Javascript
jQuery提示插件alertify使用指南
Apr 21 Javascript
jQuery中使用each处理json数据
Apr 23 Javascript
再谈JavaScript异步编程
Jan 27 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
Jun 17 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
Feb 22 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
详解vue-cli本地环境API代理设置和解决跨域
Sep 05 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
Aug 28 Javascript
css+js实现部分区域高亮可编辑遮罩层
Mar 04 #Javascript
JavaScript程序员应该知道的45个实用技巧
Mar 04 #Javascript
js判断url是否有效的两种方法
Mar 04 #Javascript
js 判断js函数、变量是否存在的简单示例代码
Mar 04 #Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 #Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 #Javascript
js实现文本框中焦点在最后位置
Mar 04 #Javascript
You might like
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
详解python itertools功能
2020/02/07 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
css3学习心得分享
2013/08/19 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
HTML5拖拽文件到浏览器并实现文件上传下载功能代码
2013/06/06 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
乡镇干部先进事迹材料
2014/02/03 职场文书
高中学生评语大全
2014/04/25 职场文书
2014年党务工作总结
2014/11/25 职场文书
公司庆典主持词
2015/07/04 职场文书
素质教育学习心得体会
2016/01/19 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis