Dart语法学习1

前言 为什么学习Dart?


  1. Dart语法简洁高效,拥有数以千计的packages 生态系统

  2. Dart 提供提前编译优化,以在移动设备和 web 上实现可预测的高性能和快速启动

  3. Dart 可以编译成 ARM 和 x86 代码,因此 Dart 移动应用程序可以在 iOS,Android 及 更高版本上实现本地运行。 对于 web 应用程序,Dart 可以转换为 JavaScript

4.Dart 是面向对象的编程语言,语法风格对于许多现有的开发人员来说都很熟悉。 如果您有一定的面向对象编程语言的基础 ,那么使用 Dart 也就是分分钟的事情

5.Dart 可以便捷的进行响应式编程。由于快速对象分配和垃圾收集器的实现, 对于管理短期对象(比如 UI 小部件), Dart 更加高效。 Dart 可以通过 Future 和 Stream 的特性和API实现异步编程。

  1. 同时也为Flutter学习打下一定的基础

二. 语言特点

1. Dart是一门纯粹的面向对象语言,在Dart中一切皆对象;函数(函数可以作为参数传递),字符串,数字等都是对象。

如下代码,数字可以调用对象方法

var text = 666.toString();
print(text);

函数作为对象传递

var list = [1, 2, 3];
  printEle(element) {
    print("输出值 is $element");
  }
 list.forEach(printEle);

系统函数forEach参数要求传一个函数

 /**
   * Applies the function [f] to each element of this collection in iteration
   * order.
   */
  void forEach(void f(E element)) {
    for (E element in this) f(element);
  }
2. Dart是一门强类型语言(js是一门弱类型语言),但也支持一些弱类型特性如:varobjectdynamic等;
  • var 实际上是编译器语法糖,声明变量后会自动推导类型,不可更改赋值类型

  • dynamic 表示动态任意类型,可以赋值任意类型,编译阶段不检测类型,被编译后是object类型

  • object 表示动态任意类型,可以赋值任意类型,编译阶段检查类型

  • 测试以下代码(可以打开注释,方便理解)*

  var p1 = 1;
  Object p2 = 2;
  dynamic p3 = 3;
  //p1 = 'A';编译期会报错;A value of type 'String' can't be assigned to a variable of type 'int'.
  // p1 = 'A';
  // p2,p3改变类型不会报错,因为都表示任意类型
  p2 = 'B';
  p3 = 'C';

//p2 因为Object编译期会检查类型,发现p2没有未定义 run函数 而报错 ;The method 'run' isn't defined for the type 'Object'.
  // p2.run();
//p3  dynamic编译器不检测类型,不会报错,运行时抛出异常;NoSuchMethodError: Class 'String' has no instance method 'run'.
  p3.run();
  print(p1);
  print(p2);
  print(p3);
  1. 兼具编译性语言特点和解释性语言特点
  • 对开发web应用来讲:dart会被转译成js
  • 对app、服务端、桌面应用讲:dart提供了开发模式,通过vm解释执行,支持热更新,具有解释型语言特点;也提供了生产模式,通过编译成机器码执行,具有编译型语言特点

三.开始学习吧

1. Dart支持以下基本数据类型:
  • Numbers
  • Strings
  • Booleans
  • List(数组)
  • Maps(字典键值对)


2. 变量声明:
  • 可以显示声明指明类型,方便编译器做一些静态检查如:
    int age = 18;
  • 可以var声明类型,变量初始化后自动推导类型,并且不可更改赋值类型
    var p1 = 1;
    注意以下写法也是正确的:
 var name;
  name = "无名氏";
  name = 18;
  name.run();
  print(name);

声明时不赋值则等同于声明了一个动态类型(dynamic)变量


  1. static final const关键字
  • static:用于修饰成员变量,这个变量是属于的,而不是属于对象的,除此之外没有其他别的含义了
  • final修饰的变量不许进行初始化,赋值之后不能再改变;编译期和运行期确定值都可以
  • const修饰变量,必须进行初始化,赋值之后不能再改变,该变量必须编译器就确定,否则会报错
getInfo() {
    return "个人信息";
  }

  const name = "我爱学习啊";
 //报错,因为编译期间不能确定info值;Const variables must be initialized with a constant value.
  const info = getInfo();

  final name1 = "我也爱学习";
//不报错
  final info1 = getInfo();

const还可以用来构造对象;表明该对象在编译期就能够完全确定,所以该对象类所有属性都必须使用final 或者 const修饰,也就是说该对象所有属性都是不能改变的既该对象是不可变的;

void main() {
  People p = const People("flutter");
}

class People {
  final name;
  const People(name) : this.name = name;
}

如果对象类属性不适用final修饰,则该对象某个属性是可变的,那么该对象就不能被称为是不可变的,所以会报错;

void main() {
  People p = const People("flutter");
}

class People {
  final name;
//也可以
  static const height = 180;
  int age;
//Can't define a const constructor for a class with non-final fields.
  const People(name) : this.name = name;
}

const构造集合,说明该集合完全不可变,类似OC中不可变集合;

  const array = const [1, 2, 3];
  array[0] = 0;
  //运行时报错;Unhandled Exception: Unsupported operation: Cannot modify an    unmodifiable list
  print(array);

相同的const变量,内存中只会创建一次

  var list1 = const [1, 2, 3];
  var list2 = const [1, 2, 3];
  //判断是否指向同一个对象
  bool result = identical(list1, list2);
  if (result) {
    print("是同一个对象");
  } else {
    print("不是同一个对象");
  }

输出flutter: 是同一个对象


  1. 变量未初始化的默认值:
    在Dart中未初始化变量都为null,null也是Object子类
  var name;
  int age;
  Object people;
  List list;
  dynamic dy;
  print(name);
  print(age);
  print(people);
  print(list);
  print(dy);

全输出null



5.类型判断:
a is Object去判断

//输出 true
print(null is Object);
//输出 true debug下输出,release忽略
assert(null is Object);


  1. 类型转换:
    Dart是强类型语言,所以需要显示转换。常见的转换:
  String aa = "111";
  //String-> int
  int bb = int.parse(aa);
  // int -> double
  double cc = bb.toDouble();
  // String -> double
  double dd = double.parse("1.1");
  // num -> String
  aa = cc.toString();
  //double指定位数 ->String
  String ee = 3.141592.toStringAsFixed(3); //结果为3.141

你可能感兴趣的:(Dart语法学习1)