JavaScript学习日记 : Day2 - 动态型别+弱型别

1. 静态型别 VS. 动态型别

1.1 静态型别的例子

以Java为例:

int x

在宣告x变数时,使用了int这个关键字让x的型别定在数字型别,而不能更改,如果企图更改放入非整数的值 :

int x 
x = 'hi'

编译时就会出现以下错误

HelloWorld.java:5: error: incompatible types: String cannot be converted to int

静态型别的语言十分严谨,在语法撰写时会相对麻烦(以JavaScript的角度看XD),但相对的可以减少很多因为型别所导致的Bug。

1.2 动态型别的例子

以JavaScript为例子:

let y = 100
y = '100'

在JavaScript中,在编写的过程中可以任意变更变数的型别,在执行(Runtime)时并不会报错。

1.3 静态、动态型别总结

静态语言(Statically Typed Languages)

  • 型态检查(Type Checking)发生在编译时期(Complile Time)
  • 必须明确使用型别宣告
  • 型别宣告後,在执行时无法进行转换型别

动态语言(Dynamically Typed Languages)

  • 型别检查(Type Checking)发生在执行阶段(Runtime)
  • 不需使用明确的型别宣告
  • 执行时能随意变更型别

2. 强型别 vs. 弱型别

2.1 强型别例子

一样以Java为例:

int x = 100 + "100"
System.out.println(x)

出现编译错误:

HelloWorld.java:4: error: incompatible types: String cannot be converted to int

Java并不会自动转换型别去加总,如果是想要实现100+100的效果,可以使用以下方法:

int x = 100 + Integer.parseInt("100");
System.out.println(x); // 200

这就是所谓的强型别,不会隐性的转换变数的型别。

2.2 弱型别的例子

一样以JavaScript为例子:

let a = 123 + "456";

console.log(a) // 123456

成功执行,并且没有错误讯息,只是JavaScript预设会把数字转换为字串,如果目标是123+456的话可以使用以下方法:

let a = 123 + Number("456")

console.log(a) // 579

弱型别最常导致Bug的情况,除了混用不同型别去做数学运算或是字串的串接,另一个就是允许不同型别的比较:

  • == : 宽松比对,只比对两值的内容
  • === : 严谨比对,比较两值的型别与内容
let a = 123
let b = "123"
console.log(a==b,a===b) // true, false

2.3 强弱型别总结

  • 强型别(strongly typed) : 偏向不容许隐性型别转换,型别检查比较严格。
  • 弱型别(weakly typed) : 偏向允许隐性型别转换,型别检查比较宽松。

结论

以一张图可以清楚知道常见的语言型别特性

(Source:动态语言、静态语言、强型别和弱型别)

透过以上的介绍可以知道JavaScript是属於动态弱型别语言,这样的组合让JavaScript在撰写上相对松散与不安全,但是JavaScript终究是动态网页不可缺少的角色,这也是为什麽TypeScript的出现,长期而言,在一些大型专案有助於开发与维护的稳定性。

参考资料:

动态语言与静态?直译与编译?强型别与弱型别?
资料型态的梦魇


<<:  Day 14 在VSCode中使用Azure

>>:  Day 14 ( 中级 ) 键盘钢琴 ( 音符动画 )

Day 02-购物车系统简介

前言 随着网路逐渐普及,越来越多人选择'网购',而网购中最後结帐的部分极为重要。 今天要来讲讲:离线...

2021-Day25. Serverless(十 三): AWS - ECS Deploy

第一次後制工作做到怀疑人生 0.0 看一次就发现一次AWS帐号的个资出现在画面上,每看一次就抓到一...

Day 19 - UML x Component — Independent (上)

前面把有依赖关系的 Component 都讲一讲之後,今天就来带过其他的 UI 元件吧,因为想介绍...

[Day22] Flutter GetX with Dio (一)

Dio Dio是 http request的framework 也可以用内建的HttpClient或...

Day3大哥我错了我选择vue2

接续昨天我们要决定使用哪一个前端框架 最後我选择使用vuetify 使用前端框架的用意是让我们的网站...