Các Khái Niệm Cơ Bản Về Biến Và Kiểu Dữ Liệu Trong Ngôn Ngữ Dart

Quản lý biến trong Dart

// Biến có kiểu ngầm định, hệ thống sẽ tự xác định kiểu dữ liệu
var ten = 'An';
// Biến có thể thay đổi kiểu động, chấp nhận nhiều loại dữ liệu khác nhau
dynamic ten = 'An';
// Biến được khai báo rõ ràng với kiểu cụ thể
String ten = 'An';
// Giá trị mặc định của tất cả các biến là null
int soDong;
assert(soDong == null);
// Hằng số runtime sử dụng từ khóa final
final ten = 'An'; // Không có chú thích kiểu dữ liệu
final String danhHieu = 'Annie';
// ten = 'Binh'; // Lỗi: không thể gán lại cho biến final
// Hằng số thời gian biên dịch dùng const
const trieu = 1000000; // Đơn vị áp suất (dynes/cm2)
const double atm = 1.01325 * trieu; // Áp suất tiêu chuẩn
// const cũng được sử dụng để tạo đối tượng hằng
var arr = const [];
final brr = const [];
const crr = []; // Tương đương với `const []`
// Biến có thể được gán lại nếu khởi tạo bằng const object
arr = [1, 2, 3]; // Trước đó là const []
// crr = [42]; // Lỗi: Biến hằng không thể gán giá trị mới.
// Cú pháp nâng cao
// Các hằng số hợp lệ từ Dart 2.5 trở đi.
const Object giaTri = 3; // Trong đó giaTri là const Object có giá trị int...
const danhSach = [giaTri as int]; // Sử dụng ép kiểu.
const banDo = {if (giaTri is int) giaTri: "int"}; // Dùng is và collection if.
const tapHop = {if (danhSach is List<int>) ...danhSach}; // ...và toán tử trải.

Các kiểu dữ liệu tích hợp sẵn

Kiểu số học num

int và double đều là 64-bit, đều kế thừa từ lớp num

// Kiểu số nguyên
var x = 1;
var hex = 0xDEADBEEF;
// Kiểu số thực
var y = 1.1;
var muSo = 1.42e5;
// Số nguyên tự động chuyển sang số thực khi cần
double z = 1; // Tương đương với double z = 1.0.
// Chuyển từ chuỗi sang số nguyên
var mot = int.parse('1');
assert(mot == 1);
// Chuyển từ chuỗi sang số thực
var motChamMot = double.parse('1.1');
assert(motChamMot == 1.1);
// Chuyển số nguyên sang chuỗi
String motAsChuoi = 1.toString();
assert(motAsChuoi == '1');
// Chuyển số thực sang chuỗi
String piAsChuoi = 3.14159.toStringAsFixed(2);
assert(piAsChuoi == '3.14');
// Các phép toán bitwise
assert((5 << 1) == 10); // 0101 << 1 == 1010
assert((5 >> 1) == 2); // 0101 >> 1 == 0010
assert((5 | 3) == 7); // 0101 | 0011 == 0111
// Tính toán giữa các hằng số thời gian biên dịch
const giayTrongPhut = 60;
const phutCanLai = 2;
const giayCanLai = phutCanLai * giayTrongPhut;

Kiểu chuỗi String

// Có thể sử dụng dấu nháy đơn hoặc kép
var s1 = 'Dấu nháy đơn hoạt động tốt cho chuỗi ký tự.';
var s2 = "Dấu nháy kép cũng hoạt động như nhau.";
var s3 = 'Rất dễ dàng để thoát khỏi dấu phân cách chuỗi.';
var s4 = "Còn dễ hơn nữa khi dùng dấu phân cách khác.";
// Ghép chuỗi sử dụng cú pháp ${bieuThuc}
var noiDung = 'ghép chuỗi thông minh';
assert('Dart hỗ trợ $noiDung, rất tiện lợi.' ==
    'Dart hỗ trợ ghép chuỗi thông minh, ' +
        'rất tiện lợi.');
assert('Đáng lẽ viết hoa. ' +
        '${noiDung.toUpperCase()} rất tiện lợi!' ==
    'Đáng lẽ viết hoa. ' +
        'GHÉP CHUỖI THÔNG MINH rất tiện lợi!');
// So sánh chuỗi sử dụng toán tử ==
var s1 = 'Chuỗi '
    'nối'
    " hoạt động cả qua dòng mới.";
assert(s1 ==
    'Chuỗi nối hoạt động cả qua '
        'dòng mới.');
var s2 = 'Toán tử + ' + 'cũng hoạt động.';
assert(s2 == 'Toán tử + cũng hoạt động.');
// Các chuỗi cạnh nhau tự động nối lại với nhau
// Nối chuỗi bằng toán tử +
var s1 = 'Chuỗi '
    'nối'
    " hoạt động cả qua dòng mới.";
assert(s1 ==
    'Chuỗi nối hoạt động cả qua '
        'dòng mới.');
var s2 = 'Toán tử + ' + 'cũng hoạt động.';
assert(s2 == 'Toán tử + cũng hoạt động.');
// Dùng ba dấu nháy để tạo chuỗi đa dòng
var s1 = '''
Bạn có thể tạo
chuỗi nhiều dòng như chuỗi này.
''';
var s2 = """Đây cũng là một
chuỗi nhiều dòng.""";
// Chuỗi nguyên bản bắt đầu bằng r
var s = r'Trong chuỗi nguyên bản, ngay cả \n cũng không được xử lý đặc biệt.';
// Tính toán giữa các hằng số thời gian biên dịch
// Những điều này hoạt động trong chuỗi const.
const soConst = 0;
const boolConst = true;
const chuoiConst = 'một chuỗi hằng';
// Những điều này KHÔNG hoạt động trong chuỗi const.
var soBien = 0;
var boolBien = true;
var chuoiBien = 'một chuỗi';
const danhSachConst = [1, 2, 3];
//
const chuoiValid = '$soConst $boolConst $chuoiConst';
// const chuoiInvalid = '$soBien $boolBien $chuoiBien $danhSachConst';

Kiểu luận lý bool

Kiểu boolean chỉ có hai giá trị: true và false.

// Kiểm tra chuỗi rỗng.
var hoTen = '';
assert(hoTen.isEmpty);
// Kiểm tra số không.
var mau = 0;
assert(mau <= 0);
// Kiểm tra giá trị null.
var kyLin;
assert(kyLin == null);
// Kiểm tra NaN (Not a Number).
var toiMuonLamDieuNay = 0 / 0;
assert(toiMuonLamDieuNay.isNaN);

Kiểu danh sách (Array) List

// Kiểu danh sách chứa số nguyên
var ds = [1, 2, 3];
assert(ds.length == 3);
assert(ds[1] == 2);
ds[1] = 1;
assert(ds[1] == 1);
// Danh sách hằng số
var dsHang = const [1, 2, 3];
// dsHang[1] = 1; // Bỏ comment dòng này sẽ gây lỗi.
// Toán tử trải (...)
var ds = [1, 2, 3];
var dsMoi = [0, ...ds];
assert(dsMoi.length == 4);
// Toán tử trải kiểm tra null (...?)
var ds;
var dsMoi = [0, ...?ds];
assert(dsMoi.length == 1);
// Dùng if trong danh sách (collection if)
var thanhDieuHuong = [
  'Trang chủ',
  'Đồ nội thất',
  'Cây cảnh',
  if (khuyenMaiKichHoat) 'Giảm giá'
];
// Dùng for trong danh sách (collection for)
var danhSachSo = [1, 2, 3];
var danhSachChuoi = [
  '#0',
  for (var i in danhSachSo) '#$i'
];
assert(danhSachChuoi[1] == '#1');

Kiểu tập hợp Set

var halogen = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
// Tập hợp rỗng
var ten = <String>{};
// Set<String> ten = {}; // Cách này cũng hoạt động.
// var ten = {}; // Tạo map, không phải set.
// Phương thức length
var nguyenTo = <String>{};
nguyenTo.add('fluorine');
nguyenTo.addAll(halogen);
assert(nguyenTo.length == 5);
// Tập hợp hằng số
final tapHopHang = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// tapHopHang.add('helium'); // Bỏ comment dòng này gây lỗi.
// Kiểu Set cũng hỗ trợ collection if, collection for, (...), (...?)

Kiểu ánh xạ Map

// Kiểu Map
var quaTang = {
  // Khóa:   Giá trị
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};
// Kiểu Map
var khiHiem = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
// Thêm cặp khóa-giá trị
var quaTang = {'first': 'partridge'};
quaTang['fourth'] = 'calling birds'; // Thêm cặp khóa-giá trị
// Truy xuất giá trị theo khóa
var quaTang = {'first': 'partridge'};
assert(quaTang['first'] == 'partridge');
// Giá trị trả về là null nếu khóa không tồn tại
var quaTang = {'first': 'partridge'};
assert(quaTang['fifth'] == null);
// Phương thức length
var quaTang = {'first': 'partridge'};
quaTang['fourth'] = 'calling birds';
assert(quaTang.length == 2);
// Map hằng số
final banDoHang = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
// banDoHang[2] = 'Helium'; // Bỏ comment dòng này gây lỗi.
// Kiểu Map cũng hỗ trợ collection if, collection for, (...), (...?)

Kiểu ký tự Unicode rune

Chuỗi bên trong sử dụng UTF-16

\u2665 biểu thị ♥
\u{1f606} biểu thị 😆
import 'package:characters/characters.dart';
...
var chao = 'Xin chào 🇻🇳';
print(chao);
print('Cuối chuỗi: ${chao.substring(chao.length - 1)}');
print('Ký tự cuối cùng: ${chao.characters.last}\n');
// Xin chào 🇻🇳
// Cuối chuỗi: ???
// Ký tự cuối cùng: 🇻🇳

Kiểu ký hiệu Symbol

#coSo
#thanhPhan

Thẻ: Dart variables data-types string number

Đăng vào ngày 20 tháng 6 lúc 03:25