Skip to content

Python 与 JavaScript 语法差异对比

本文档详细对比了Python和JavaScript在语法上的主要差异,通过代码示例帮助理解两种语言的不同特点。

1. 变量声明和作用域

JavaScript

javascript
// 变量声明
var oldStyle = "旧方式"; // 函数作用域
let blockScoped = "块级作用域"; // 块级作用域
const constant = "常量"; // 常量,块级作用域

// 类型可以改变
let variable = 42;
variable = "现在是字符串";

Python

python
# 变量声明 - 直接赋值
old_style = "Python风格"  # 使用下划线命名
block_scoped = "没有特殊声明关键字"
CONSTANT = "常量约定用大写"  # 约定,不是强制

# 类型可以改变
variable = 42
variable = "现在是字符串"

2. 数据类型

JavaScript

javascript
// 基本数据类型
let number = 42;
let string = "字符串";
let boolean = true;
let undefined_val = undefined;
let null_val = null;
let symbol = Symbol("唯一标识");
let bigint = 123n;

// 复合数据类型
let array = [1, 2, 3];
let object = { name: "张三", age: 25 };

// 类型检查
console.log(typeof number); // "number"
console.log(Array.isArray(array)); // true

Python

python
# 基本数据类型
number_int = 42
number_float = 3.14
string = "字符串"
boolean = True  # 注意大写
none_val = None  # 相当于JS的null

# 复合数据类型
list_type = [1, 2, 3]  # 列表(类似JS数组)
tuple_type = (1, 2, 3)  # 元组(不可变)
dict_type = {"name": "张三", "age": 25}  # 字典(类似JS对象)
set_type = {1, 2, 3}  # 集合

# 类型检查
print(type(number_int))  # <class 'int'>
print(isinstance(list_type, list))  # True

3. 函数定义

JavaScript

javascript
// 函数声明
function greet(name) {
    return `你好, ${name}!`;
}

// 函数表达式
const greetArrow = (name) => {
    return `你好, ${name}!`;
};

// 简写箭头函数
const greetShort = name => `你好, ${name}!`;

// 默认参数
function greetDefault(name = "世界") {
    return `你好, ${name}!`;
}

// 调用
console.log(greet("小明"));

Python

python
# 函数定义
def greet(name):
    return f"你好, {name}!"

# 默认参数
def greet_default(name="世界"):
    return f"你好, {name}!"

# 关键字参数
def greet_full(first_name, last_name=""):
    return f"你好, {first_name} {last_name}!"

# Lambda函数(类似JS箭头函数)
greet_lambda = lambda name: f"你好, {name}!"

# 调用
print(greet("小明"))
print(greet_full("张", last_name="三"))
print(greet_lambda("小红"))

4. 条件语句

JavaScript

javascript
// if-else
let score = 85;
if (score >= 90) {
    console.log("优秀");
} else if (score >= 80) {
    console.log("良好");
} else {
    console.log("需要努力");
}

// 三元操作符
let result = score >= 60 ? "及格" : "不及格";

// switch语句
switch (score) {
    case 100:
        console.log("满分");
        break;
    case 90:
        console.log("优秀");
        break;
    default:
        console.log("继续努力");
}

Python

python
# if-elif-else
score = 85
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
else:
    print("需要努力")

# 三元操作符(条件表达式)
result = "及格" if score >= 60 else "不及格"

# Python没有switch,使用字典或if-elif替代
def score_level(score):
    levels = {
        100: "满分",
        90: "优秀",
    }
    return levels.get(score, "继续努力")

print(score_level(100))

5. 循环语句

JavaScript

javascript
// for循环
for (let i = 0; i < 5; i++) {
    console.log(i);
}

// for...of (遍历值)
let fruits = ["苹果", "香蕉", "橙子"];
for (let fruit of fruits) {
    console.log(fruit);
}

// for...in (遍历键/索引)
for (let index in fruits) {
    console.log(index, fruits[index]);
}

// while循环
let count = 0;
while (count < 3) {
    console.log(count);
    count++;
}

// forEach方法
fruits.forEach((fruit, index) => {
    console.log(index, fruit);
});

Python

python
# for循环 - 使用range
for i in range(5):
    print(i)

# for循环 - 直接遍历
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
    print(fruit)

# enumerate - 获取索引和值
for index, fruit in enumerate(fruits):
    print(index, fruit)

# while循环
count = 0
while count < 3:
    print(count)
    count += 1

# 列表推导式(Python特有)
squares = [x**2 for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

6. 对象/类定义

JavaScript

javascript
// ES6类
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    
    greet() {
        return `我是${this.name},今年${this.age}岁`;
    }
    
    static species() {
        return "智人";
    }
}

// 继承
class Student extends Person {
    constructor(name, age, grade) {
        super(name, age);
        this.grade = grade;
    }
    
    study() {
        return `${this.name}正在学习`;
    }
}

let student = new Student("小明", 16, "高一");
console.log(student.greet());
console.log(student.study());

Python

python
# Python类
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def greet(self):
        return f"我是{self.name},今年{self.age}岁"
    
    @staticmethod
    def species():
        return "智人"
    
    @classmethod
    def from_string(cls, person_str):
        name, age = person_str.split('-')
        return cls(name, int(age))

# 继承
class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)  # 或者 Person.__init__(self, name, age)
        self.grade = grade
    
    def study(self):
        return f"{self.name}正在学习"

student = Student("小明", 16, "高一")
print(student.greet())
print(student.study())

7. 异常处理

JavaScript

javascript
// try-catch-finally
function divide(a, b) {
    try {
        if (b === 0) {
            throw new Error("除数不能为零");
        }
        return a / b;
    } catch (error) {
        console.log("捕获错误:", error.message);
        return null;
    } finally {
        console.log("执行清理工作");
    }
}

// Promise异常处理
async function fetchData() {
    try {
        let response = await fetch('https://api.example.com/data');
        let data = await response.json();
        return data;
    } catch (error) {
        console.log("网络错误:", error);
    }
}

Python

python
# try-except-finally
def divide(a, b):
    try:
        if b == 0:
            raise ValueError("除数不能为零")
        return a / b
    except ValueError as e:
        print(f"捕获错误: {e}")
        return None
    except Exception as e:
        print(f"未知错误: {e}")
        return None
    finally:
        print("执行清理工作")

# 上下文管理器
def read_file(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            content = file.read()
            return content
    except FileNotFoundError:
        print(f"文件 {filename} 不存在")
        return None

8. 模块和导入

JavaScript

javascript
// 导出 (module.js)
export const PI = 3.14159;
export function add(a, b) {
    return a + b;
}
export default function multiply(a, b) {
    return a * b;
}

// 导入
import multiply, { PI, add } from './module.js';
import * as math from './module.js';

console.log(PI);
console.log(add(2, 3));
console.log(multiply(2, 3));

Python

python
# 导出 (math_utils.py)
PI = 3.14159

def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

# 导入
import math_utils
from math_utils import PI, add
from math_utils import multiply as mult

print(PI)
print(add(2, 3))
print(mult(2, 3))
print(math_utils.PI)

9. 字符串操作

JavaScript

javascript
let name = "小明";
let age = 25;

// 字符串拼接
let message1 = "我是" + name + ",今年" + age + "岁";
let message2 = `我是${name},今年${age}岁`;  // 模板字符串

// 字符串方法
let text = "  Hello World  ";
console.log(text.trim());           // "Hello World"
console.log(text.toLowerCase());    // "  hello world  "
console.log(text.split(" "));       // ["", "", "Hello", "World", "", ""]

Python

python
name = "小明"
age = 25

# 字符串拼接
message1 = "我是" + name + ",今年" + str(age) + "岁"
message2 = f"我是{name},今年{age}岁"  # f-string (推荐)
message3 = "我是{},今年{}岁".format(name, age)  # format方法

# 字符串方法
text = "  Hello World  "
print(text.strip())        # "Hello World"
print(text.lower())        # "  hello world  "
print(text.split(" "))     # ['', '', 'Hello', 'World', '', '']

10. 主要语法差异总结

特性JavaScriptPython
缩进使用大括号 {}使用缩进(4个空格)
行尾分号可选不需要分号
注释///* */#"""
布尔值true/falseTrue/False
空值null/undefinedNone
相等比较==(类型转换)===(严格)==(值比较)
逻辑操作符&& || !and or not
字符串""''"" ''"""
数组/列表[1,2,3][1,2,3]
对象/字典{key: value}{"key": value}

总结

Python和JavaScript虽然都是动态类型语言,但在语法风格上有显著差异:

  1. Python更注重代码的可读性,使用缩进来组织代码结构
  2. JavaScript更灵活,提供了多种语法糖和现代特性
  3. Python的命名约定使用下划线,JavaScript使用驼峰命名
  4. Python有更丰富的内置数据类型(如元组、集合)
  5. JavaScript的异步编程模型更加突出

理解这些差异有助于在Vue.js项目开发中更好地运用JavaScript,同时也为学习Python打下基础。