2018-05-26 Java /JS 容易混淆的语法及使用

平时工作主要用到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类型。

image

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会有语法检验,会用颜色做区别,所以这里我决定用截图来展示:

image.png
image.png

你可能感兴趣的:(2018-05-26 Java /JS 容易混淆的语法及使用)