今天,被问到两个JS问题,当时没回答到重点,问题虽然看起来简单,但是细节却马虎不得,在此做下记录:

1. 在Javascript中 声明时用"var"与不用"var"的区别

Javascript声明变量时

var a = 111;

a = 111;

两种方式一样吗?

var a = 11;

function test4(){
var a = 22;
} test4(); console.log(a);

结果是什么呢? 11

这个好理解, 函数内的var a声明是内部变量,这时结果是第一个a的值.

变动一下如下:

var abc = 11;

function test4(){
abc = 22;
} test4(); console.log(abc);

结果是什么呢? 22

再改:

function test4(){
var aaa = 22;
} test4(); console.log(aaa);

结果怎样? 运行报错了! ReferenceError: aaa is not defined!

改:

function test4(){
var aaa = 22;
} test4(); console.log(test4.aaa);

运行不会报错,输出结果是 undefined.

函数或者对象构造内声明的变量是私有的. 外部无法访问到. 包括原型继承后的对象.

可是如果这样:

function test4(){
bbb = 33;
} test4(); console.log(bbb);

结果是 33。

这就是有var 和没有 var的声明的区别:

很可怕假如一个大的项目,在这里改变了bbb的值, 并没有添加var 碰巧整个项目全局变量有个同名bbb被改变,不加var不是只作用在这个函数或对象内. 出了错误很难找.

所以书写代码必须谨慎. 声明变量改加的就加不能怕麻烦. 结果是完全不同的.

结论: (1).在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量。

使用var定义
var a = 'hello World';
function bb(){
var a = 'hello Bill';
console.log(a);
}
bb() // 'hello Bill'
console.log(a); // 'hello world'
不使用var定义
var e = 'hello world';
function cc(){
e = 'hello Bill';
console.log(e); // 'hello Bill'
}
cc() // 'hello Bill'
console.log(e) // 'hello Bill'

(2).在全局作用域下,使用var定义的变量不可以delete,没有var定义的变量可以delete.也就说明隐含全局变量严格来说不是真正的变量,而是全局对象的属性,因为属性可以通过delete删除,而变量不可以。

(3).使用var 定义变量还会提升变量声明,即

使用var定义:
function hh(){
console.log(a);
var a = 'hello world';
}
hh() //undefined
不使用var定义:
function hh(){
console.log(a);
a = 'hello world';
}
hh() // 'a is not defined'

这就是使用var定义的变量的声明前提。

2. JS中的!=、== 、!==、===的用法和区别。

var num = 1;

var str = '1';

var test = 1;

test == num   //true 相同类型 相同值

test === num  //true 相同类型 相同值

test !== num  //false test与num类型相同,其值也相同, 非运算肯定是false

num == str   //true  把str转换为数字,检查其是否相等。

num != str   //false  == 的 非运算

num === str  //false  类型不同,直接返回false

num !== str  //true   num 与 str类型不同 意味着其两者不等 非运算自然是true啦

(1). JavaScript"=="的作用

== 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果。

  1. 当==两边的内容是字符串时,则比较字符串的内容是否相等。
  2. 当==两边的内容是数字时,则比较数字的大小是否相等。
  3. 当==两边的内容是对象或者是对象的函数属性时,则比较内存地址是否相等

(2). ==和===的区别

=== 和 !== 只有在相同类型下,才会比较其值。

  ==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase

总结:

  ==和===的区别:"==" 只要求值相等; "===" 要求值和类型都相等

在Javascript中 声明时用"var"与不用"var"的区别,== 和 ===的区别的更多相关文章

  1. 【转载】在Javascript中 声明时用"var"与不用"var"的区别

    原文链接:http://www.2cto.com/kf/201204/128406.html[侵删]   Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有 ...

  2. 在Javascript中 声明时用"var"与不用"var"的区别

    http://www.cnblogs.com/juejiangWalter/p/5725220.html var num = 0;function start() {    num = 3;} 只要一 ...

  3. 关于Javascript中声明变量、函数的笔记

    一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1, ...

  4. JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别

    ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...

  5. [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别

    ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...

  6. JavaScript中用var和不用var的区别

    Javascript声明变量的,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. varnum=1; 是在当前域中声 ...

  7. JS函数的参数声明中用 var 与不用 var的区别

    1.var 声明的变量,作用域是当前 function 2.没有声明的变量,直接赋值的话, 会自动创建变量,但作用域是全局的. 例如: function doSth() { a = "AAA ...

  8. Javascript中的undefined、null、""、0值和false的区别总结

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...

  9. js 参数声明用var和不用var的区别

    var 声明的变量,作用域是当前 function 没有声明的变量,直接赋值的话, 会自动创建变量 ,但作用域是全局的. //----------------- function doSth() { ...

随机推荐

  1. TreeSet的自然排序(自定义对象 compareTo方法)

    >要实现自然排序,对象集合必须实现Comparable接口,并重写compareTo()方法 >一般需求中描述的是"主要条件",如:按姓名长度排序.  需注意次要条件 ...

  2. python3: 字符串和文本

    1. 分割字符串-使用多个界定符[re.split()] >>> line = 'asdf fjdk; afed, fjek,asdf, foo' >>> impo ...

  3. Java编程练习题

      曾经,有人说过,没有刷题的人生是不完整的.看了几天Java,我试着做了几道练习题,好让我的人生完整一点.(偷笑--)这里挑了一些题来跟大家分享,本文不定期更新. 题目集  1. 最后一个单词的长度 ...

  4. Python的multiprocessing,Queue,Process

    在多线程multiprocessing模块中,有两个类,Queue(队列)和Process(进程): 在Queue.py中也有一个Queue类,这两个Queue的区别? from multiproce ...

  5. jdk1.5-jdk1.9的主要区别

    jdk1.5相对以前jdk版本主要新增功能 1.自动拆箱和装箱 其中基本数据类型的包装类有:Double,Float,Long,Integer,Short,Character和Boolean 2.提供 ...

  6. Django在admin模块中显示auto_now_add=True或auto_now=True的时间类型列

    转载自: http://www.tuicool.com/articles/ZryE7f 在Django如果model中的列定义了auto_now_add或auto_now属性,那么这种列不会在admi ...

  7. 在jupyter notebook中运行R语言

    要想在jupyter notebook中运行R语言其实非常简单,按顺序安装下面扩展包即可: install.package('repr','IRdisplay','evaluate','crayon' ...

  8. 中间人攻击-MITM攻击

    中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机 ...

  9. yii在哪些情况下可以加载yiilite.php?

    yii权威指南上说,在开启apc缓存的情况下,可以加载yiilite.php提升性能.我有以下几点疑问: 1.开启apc缓存的情况下,引入yiilite.php能提升性能的原因是因为缓存了opcode ...

  10. react中受控组件相关的warning

    在表单中,报如下的错,意思是非受控的输入框变成了受控的,报错信息如下 Warning: A component is changing an uncontrolled input of type te ...