|
2 | 2 |
|
3 | 3 | 私は毎日、JavaScriptに関する選択問題を [Instagram](https://www.instagram.com/theavocoder)に投稿していますが、ここにも投稿します。
|
4 | 4 |
|
5 |
| -初級から上級まで: JavaScriptの知識のテストを行ったり、知識を少し深めたり、コーディング面接の準備をしてください。:muscle: :rocket: 私はこのレポを毎週新しい質問で更新します。 |
| 5 | +初級から上級まで: JavaScriptの知識のテストを行ったり、知識を少し深めたり、コーディング面接の準備をしてください。:muscle: :rocket: 私はこのレポを毎週新しい質問で更新します。Last update: <a href=#20190629><b>June 29th</b></a> |
6 | 6 |
|
7 | 7 | 答えは質問の下の折りたたまれたセクションにあります、クリックすればそれを広げられます。幸運を祈ります。:heart:
|
8 | 8 |
|
@@ -1711,3 +1711,309 @@ yに関しては、`y`に`10`を代入するときにグローバル変数`y`を
|
1711 | 1711 |
|
1712 | 1712 | </p>
|
1713 | 1713 | </details>
|
| 1714 | + |
| 1715 | +###### <a name=20190629></a>55. 何が出力されるでしょうか? |
| 1716 | + |
| 1717 | +```javascript |
| 1718 | +class Dog { |
| 1719 | + constructor(name) { |
| 1720 | + this.name = name; |
| 1721 | + } |
| 1722 | +} |
| 1723 | + |
| 1724 | +Dog.prototype.bark = function() { |
| 1725 | + console.log(`Woof I am ${this.name}`); |
| 1726 | +}; |
| 1727 | + |
| 1728 | +const pet = new Dog("Mara"); |
| 1729 | + |
| 1730 | +pet.bark(); |
| 1731 | + |
| 1732 | +delete Dog.prototype.bark; |
| 1733 | + |
| 1734 | +pet.bark(); |
| 1735 | +``` |
| 1736 | + |
| 1737 | +- A: `"Woof I am Mara"`, `TypeError` |
| 1738 | +- B: `"Woof I am Mara"`,`"Woof I am Mara"` |
| 1739 | +- C: `"Woof I am Mara"`, `undefined` |
| 1740 | +- D: `TypeError`, `TypeError` |
| 1741 | + |
| 1742 | +<details><summary><b>答え</b></summary> |
| 1743 | +<p> |
| 1744 | + |
| 1745 | +#### 答え: A |
| 1746 | + |
| 1747 | +プロトタイプでも、`delete`キーワードを使ってオブジェクトからプロパティを削除できます。プロトタイプのプロパティを削除すると、プロトタイプチェーンでは使用できなくなります。 |
| 1748 | + |
| 1749 | +この場合、`bark`関数は `delete Dog.prototype.bark`の後のプロトタイプでは、もう利用できず、それでもアクセスし、関数ではない何かを呼び出そうとすると、`TypeError`がスローされます。 |
| 1750 | + |
| 1751 | +関数ではない何かを呼び出そうとすると、`pet.bark`は`undefined`なので、`TypeError`がスローされ、`TypeError: pet.bark is not a function`となります。 |
| 1752 | + |
| 1753 | +</p> |
| 1754 | +</details> |
| 1755 | + |
| 1756 | +--- |
| 1757 | + |
| 1758 | +###### 56. 何が出力されるでしょうか? |
| 1759 | + |
| 1760 | +```javascript |
| 1761 | +const set = new Set([1, 1, 2, 3, 4]); |
| 1762 | + |
| 1763 | +console.log(set); |
| 1764 | +``` |
| 1765 | + |
| 1766 | +- A: `[1, 1, 2, 3, 4]` |
| 1767 | +- B: `[1, 2, 3, 4]` |
| 1768 | +- C: `{1, 1, 2, 3, 4}` |
| 1769 | +- D: `{1, 2, 3, 4}` |
| 1770 | + |
| 1771 | +<details><summary><b>答え</b></summary> |
| 1772 | +<p> |
| 1773 | + |
| 1774 | +#### 答え: D |
| 1775 | + |
| 1776 | + |
| 1777 | +`Set`オブジェクトは _unique_ の値の集合です: 値は集合の中で一度だけ現れることができます |
| 1778 | + |
| 1779 | +値`1`が重複したイテラブル`[1、1、2、3、4]`を渡しました。セット内に同じ値を2つ持つことはできないので、そのうちの1つが削除され`{1、2、3、4}`となります。 |
| 1780 | + |
| 1781 | +</p> |
| 1782 | +</details> |
| 1783 | + |
| 1784 | +--- |
| 1785 | + |
| 1786 | +###### 57. 何が出力されるでしょうか? |
| 1787 | + |
| 1788 | +```javascript |
| 1789 | +// counter.js |
| 1790 | +let counter = 10; |
| 1791 | +export default counter; |
| 1792 | +``` |
| 1793 | + |
| 1794 | +```javascript |
| 1795 | +// index.js |
| 1796 | +import myCounter from "./counter"; |
| 1797 | + |
| 1798 | +myCounter += 1; |
| 1799 | + |
| 1800 | +console.log(myCounter); |
| 1801 | +``` |
| 1802 | + |
| 1803 | +- A: `10` |
| 1804 | +- B: `11` |
| 1805 | +- C: `Error` |
| 1806 | +- D: `NaN` |
| 1807 | + |
| 1808 | +<details><summary><b>答え</b></summary> |
| 1809 | +<p> |
| 1810 | + |
| 1811 | +#### 答え: C |
| 1812 | + |
| 1813 | +インポートされたモジュールは読み取り専用です。: インポートされたモジュールを変更することはできません。エクスポートするモジュールだけがその値を変更できます。 |
| 1814 | + |
| 1815 | +`myCounter`の値を増やそうとすると、error: `myCounter` is read-only and cannot be modified. と、エラーがスローされます。 |
| 1816 | + |
| 1817 | +</p> |
| 1818 | +</details> |
| 1819 | + |
| 1820 | +--- |
| 1821 | + |
| 1822 | +###### 58. 何が出力されるでしょうか? |
| 1823 | + |
| 1824 | +```javascript |
| 1825 | +const name = "Lydia"; |
| 1826 | +age = 21; |
| 1827 | + |
| 1828 | +console.log(delete name); |
| 1829 | +console.log(delete age); |
| 1830 | +``` |
| 1831 | + |
| 1832 | +- A: `false`, `true` |
| 1833 | +- B: `"Lydia"`, `21` |
| 1834 | +- C: `true`, `true` |
| 1835 | +- D: `undefined`, `undefined` |
| 1836 | + |
| 1837 | +<details><summary><b>答え</b></summary> |
| 1838 | +<p> |
| 1839 | + |
| 1840 | +#### 答え: A |
| 1841 | + |
| 1842 | +`delete`演算子は、ブール値を返します: 正常に削除された場合はtrue、それ以外の場合はfalseを返します。`var`, `const`または`let`キーワードで宣言された変数は`delete`演算子を使って削除することはできません。 |
| 1843 | + |
| 1844 | +`name`変数は`const`キーワードで宣言されているので、削除は成功しません: `false`が返されます。 |
| 1845 | + |
| 1846 | +`age`を`21`に設定すると、実際にはグローバルオブジェクトに`age`というプロパティを追加されました。グローバルオブジェクトからもプロパティを削除することができますので、`delete age`は`true`を返します。 |
| 1847 | + |
| 1848 | +</p> |
| 1849 | +</details> |
| 1850 | + |
| 1851 | +--- |
| 1852 | + |
| 1853 | +###### 59. 何が出力されるでしょうか? |
| 1854 | + |
| 1855 | +```javascript |
| 1856 | +const numbers = [1, 2, 3, 4, 5]; |
| 1857 | +const [y] = numbers; |
| 1858 | + |
| 1859 | +console.log(y); |
| 1860 | +``` |
| 1861 | + |
| 1862 | +- A: `[[1, 2, 3, 4, 5]]` |
| 1863 | +- B: `[1, 2, 3, 4, 5]` |
| 1864 | +- C: `1` |
| 1865 | +- D: `[1]` |
| 1866 | + |
| 1867 | +<details><summary><b>答え</b></summary> |
| 1868 | +<p> |
| 1869 | + |
| 1870 | +#### 答え: C |
| 1871 | + |
| 1872 | +配列から値を取り出したり、オブジェクトからプロパティを分解して取り出すことができます。 example: |
| 1873 | + |
| 1874 | +```javascript |
| 1875 | +[a, b] = [1, 2]; |
| 1876 | +``` |
| 1877 | + |
| 1878 | +<img src="https://i.imgur.com/ADFpVop.png" width="200"> |
| 1879 | + |
| 1880 | +`a`の値は`1`となり、`b`の値は`2`となる。実際に問題で行った事は、 |
| 1881 | + |
| 1882 | +```javascript |
| 1883 | +[y] = [1, 2, 3, 4, 5]; |
| 1884 | +``` |
| 1885 | + |
| 1886 | +<img src="https://i.imgur.com/NzGkMNk.png" width="200"> |
| 1887 | + |
| 1888 | +`y`の値が配列の最初の値、つまり`1`に等しいことを意味します。`y`をログ出力すると、`1`が返されます。 |
| 1889 | + |
| 1890 | +</p> |
| 1891 | +</details> |
| 1892 | + |
| 1893 | +--- |
| 1894 | + |
| 1895 | +###### 60. 何が出力されるでしょうか? |
| 1896 | + |
| 1897 | +```javascript |
| 1898 | +const user = { name: "Lydia", age: 21 }; |
| 1899 | +const admin = { admin: true, ...user }; |
| 1900 | + |
| 1901 | +console.log(admin); |
| 1902 | +``` |
| 1903 | + |
| 1904 | +- A: `{ admin: true, user: { name: "Lydia", age: 21 } }` |
| 1905 | +- B: `{ admin: true, name: "Lydia", age: 21 }` |
| 1906 | +- C: `{ admin: true, user: ["Lydia", 21] }` |
| 1907 | +- D: `{ admin: true }` |
| 1908 | + |
| 1909 | +<details><summary><b>答え</b></summary> |
| 1910 | +<p> |
| 1911 | + |
| 1912 | +#### 答え: B |
| 1913 | + |
| 1914 | +スプレッド演算子`...`を使ってオブジェクトを結合することができます。あるオブジェクトのキーと値のペアのコピーを作成し、それらを別のオブジェクトに追加することができます。 |
| 1915 | + |
| 1916 | +上記の場合だと、`user`オブジェクトのコピーを作成し、それらを`admin`オブジェクトに追加します。`admin`オブジェクトはコピーされたキーと値のペアを含み、その結果`{admin:true、name: "Lydia"、age:21}`となります。 |
| 1917 | + |
| 1918 | +</p> |
| 1919 | +</details> |
| 1920 | + |
| 1921 | +--- |
| 1922 | + |
| 1923 | +###### 61. 何が出力されるでしょうか? |
| 1924 | + |
| 1925 | +```javascript |
| 1926 | +const person = { name: "Lydia" }; |
| 1927 | + |
| 1928 | +Object.defineProperty(person, "age", { value: 21 }); |
| 1929 | + |
| 1930 | +console.log(person); |
| 1931 | +console.log(Object.keys(person)); |
| 1932 | +``` |
| 1933 | + |
| 1934 | +- A: `{ name: "Lydia", age: 21 }`, `["name", "age"]` |
| 1935 | +- B: `{ name: "Lydia", age: 21 }`, `["name"]` |
| 1936 | +- C: `{ name: "Lydia"}`, `["name", "age"]` |
| 1937 | +- D: `{ name: "Lydia"}`, `["age"]` |
| 1938 | + |
| 1939 | +<details><summary><b>答え</b></summary> |
| 1940 | +<p> |
| 1941 | + |
| 1942 | +#### 答え: B |
| 1943 | + |
| 1944 | +`defineProperty`メソッドを使うと、オブジェクトに新しいプロパティを追加したり、既存のプロパティを修正することができます。 `defineProperty`メソッドを使ってオブジェクトにプロパティを追加すると、それらはデフォルトでは _列挙できません_。 |
| 1945 | + |
| 1946 | +`Object.keys`メソッドはオブジェクトから全ての _enumerable_ (列挙可能)なプロパティ名を返します。上記の場合は`"name"`だけとなります。 |
| 1947 | + |
| 1948 | +`defineProperty`メソッドを使って追加されたプロパティはデフォルトでは不変となります。 この動作は`writable`, `configurable`, `enumerable`プロパティを使って上書きすることができます。このように、`defineProperty`メソッドは、オブジェクトに追加しようとしているプロパティをもっと細かく制御できます。 |
| 1949 | + |
| 1950 | +</p> |
| 1951 | +</details> |
| 1952 | + |
| 1953 | +--- |
| 1954 | + |
| 1955 | +###### 62. 何が出力されるでしょうか? |
| 1956 | + |
| 1957 | +```javascript |
| 1958 | +const settings = { |
| 1959 | + username: "lydiahallie", |
| 1960 | + level: 19, |
| 1961 | + health: 90 |
| 1962 | +}; |
| 1963 | + |
| 1964 | +const data = JSON.stringify(settings, ["level", "health"]); |
| 1965 | +console.log(data); |
| 1966 | +``` |
| 1967 | + |
| 1968 | +- A: `"{"level":19, "health":90}"` |
| 1969 | +- B: `"{"username": "lydiahallie"}"` |
| 1970 | +- C: `"["level", "health"]"` |
| 1971 | +- D: `"{"username": "lydiahallie", "level":19, "health":90}"` |
| 1972 | + |
| 1973 | +<details><summary><b>答え</b></summary> |
| 1974 | +<p> |
| 1975 | + |
| 1976 | +#### 答え: A |
| 1977 | + |
| 1978 | +`JSON.stringify`の2番目の引数は _replacer_ です。replacerは、関数または配列のいずれかにすることができ、値を文字列化する対象とその方法を制御できます。 |
| 1979 | + |
| 1980 | +replacerが _array_ の場合、名前が配列に含まれるプロパティのみがJSON文字列に追加されます。上記の場合、`"level"`と`"health"`という名前のプロパティだけが含まれ、`"username"`は除外されます。`data`は`"{" level ":19、" health ":90}"`となります。 |
| 1981 | + |
| 1982 | +replacerが _function_ の場合、この関数は文字列化しているオブジェクト内のすべてのプロパティに対して呼び出されます。この関数から返される値は、JSON文字列に追加されたときのプロパティの値になり、値が`undefined`の場合、このプロパティはJSON文字列から除外されます。 |
| 1983 | + |
| 1984 | +</p> |
| 1985 | +</details> |
| 1986 | + |
| 1987 | +--- |
| 1988 | + |
| 1989 | +###### 63. 何が出力されるでしょうか? |
| 1990 | + |
| 1991 | +```javascript |
| 1992 | +let num = 10; |
| 1993 | + |
| 1994 | +const increaseNumber = () => num++; |
| 1995 | +const increasePassedNumber = number => number++; |
| 1996 | + |
| 1997 | +const num1 = increaseNumber(); |
| 1998 | +const num2 = increasePassedNumber(num1); |
| 1999 | + |
| 2000 | +console.log(num1); |
| 2001 | +console.log(num2); |
| 2002 | +``` |
| 2003 | + |
| 2004 | +- A: `10`, `10` |
| 2005 | +- B: `10`, `11` |
| 2006 | +- C: `11`, `11` |
| 2007 | +- D: `11`, `12` |
| 2008 | + |
| 2009 | +<details><summary><b>答え</b></summary> |
| 2010 | +<p> |
| 2011 | + |
| 2012 | +#### 答え: A |
| 2013 | + |
| 2014 | +単項演算子`++`はオペランドの値を _最初に返し_ 、_その後に インクリメント_ します。`num1`の値は`10`となります。 なぜなら`incrementNumber`関数は、最初に`num`の値`10`を返し、その後に`num`の値をインクリメントするだけです。 |
| 2015 | + |
| 2016 | +`num1`を`increPassedNumber`に渡したので、`num2`は`10`です。`number`は`10`(`num1`の値です。繰り返しますが、単項演算子`++`は、オペランドの値を _最初に返し_、_その後に インクリメント_ します。したがって、`num2`は`10`となります。 |
| 2017 | + |
| 2018 | +</p> |
| 2019 | +</details> |
0 commit comments