平时工作主要用到java, JS作为中间层开发,因此在两者切换使用的过程中,有时候会错乱。这里我打算把日常遇到的java, js容易混淆的问题收集起来,有遇到我便会记录。
1. JS 变量名可以直接作为if()的判断条件,而java不可以。
一般这种使用的场景是用于做非空判断,不过当判断的是一个数组的时候,最好不要直接用变量名,因为一个size为0的数组会被当成非空。我一般用lodash的isEmpt()来判断。
在javascript里,可以直接把变量名放在if()里,通过判断变量的值,来断定条件为true或者false.
如:
let orderId="DN-1";
if(orderId){
console.log("orderid exists.")
}else{
console.log("orderid doesn't exists.")
}
输出: orderid exists.
再来看看Java, 这是在IDEA 编辑器下。很明显,IDE马上给出了错误提示,说java的if()里要的是boolean类型,而不是String类型。
2.变量作用域,和声明方式
javascript没有块级作用域,只有全局作用域和函数作用域。而java 这三个域都有。域对变量的作用就是限制在这个域里定义的变量的有效性。
java利用修饰符来约束变量的作用域,例如static, final, public, private,friendly等,都比较清晰,这里不讲,主要讲js的var, let,及没有var也没有let定义的变量。
如下,因为js没有块作用域,所以下面的if - else其实就是一个域,(如果在java中,域是用{} 来划分,那么在这个case里是2个域哦。) if里声明了一个全局变量var, 虽然条件为false, 如果按照java的思维,var str = "I am in 1" 连执行都不可能,不过在这里,str也不会被赋值“I am in 1”,但是var str会执行**。因此下面程序输出 “I am in 2”, 然而,并不是str被由"I am in 1" 改写成"I am in 2", 看紧接着的第二段代码,用来证明上面这行黑体字。
if(false){
var str ="I am in 1"
}else{
str ="I am in 2"
}
console.log(str);
输出:"I am in 2"
我把else里的str注释掉,结果输出undefined, 说明var str ="I am in 1"并没被执行,而只是执行了var str; (如果连var都没有,而要打印str那是会报错而不是输出undefined)
if(false){
var str ="I am in 1"
}else{
// str = "I am in 2"
console.log(str);
}
歪个楼说下js let。From ruanyifeng: ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
if(true){
let a ="I am in 1"
}
console.log(a)
输出:
console.log(a)
ReferenceError: a is not defined
-----但是下面这个例子就有点迷惑性了。我是想解释下js的全局变量,没有通过var或者let声明的变量是个全局变量
var如果是声明全局变量,跟没有var声明的变量作用域相同,但在function里用var声明的变量作用域只能是这个function。
因为IDE会有语法检验,会用颜色做区别,所以这里我决定用截图来展示:


网友评论